ASP.Net MVC 4 API 自定义方法名称

本文关键字:自定义方法 API Net MVC ASP | 更新日期: 2023-09-27 18:31:57

我有一个问题,我想用自定义名称调用MVC Api方法。

我更改了 WebApi.config,如此处所述

    config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id="test" }
    );

并写了一个类

public class MissingCardBoxModelController : ApiController
{
    // GET api/missingcardboxmodel
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
    // GET api/missingcardboxmodel/5
    public string Get(string id)
    {
        return id;
    }
    public string GetTrackingNumber(string parcelLabelNumber) 
    {
        string trackingNumber = "some number";
        return trackingNumber;
    }
    // POST api/missingcardboxmodel
    public void Post([FromBody]string value)
    {
    }
    // PUT api/missingcardboxmodel/5
    public void Put(int id, [FromBody]string value)
    {
    }
    // DELETE api/missingcardboxmodel/5
    public void Delete(int id)
    {
    }
}

但是我无法通过 http://localhost:58528/api/MissingCardBoxModel/GetTrackingNumber/123456 调用该方法

我收到消息

在控制器"Missing CardBoxModel"上未找到任何操作 匹配请求。

为什么我不能调用该方法?

ASP.Net MVC 4 API 自定义方法名称

如果路由配置为这些(MVC 解决方案模板中的默认值):

url: "{controller}/{action}/{id}"

您应该将parcelLabelNumber更改为 id。

您可以在此处阅读有关路线的更多信息。

默认情况下,

Web API 允许 Restful 约定,这意味着它将自动映射GET, PUT, POST, DELETE等操作名称。 如果您在路线中查看WebApiConfig,则只允许以下路线

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

这意味着它只允许

.../api/yourcontrollername/a parameter that will map to id

.您基本上有 2 个选项,一个使用属性路由。或者,您可以将路由添加到自定义方法中,例如:

config.Routes.MapHttpRoute(
                name: "custom",
                routeTemplate: "api/{controller}/{action}/{parcelLabelNumber}",
                defaults: new { parcelLabelNumber = "" }
            );

另请注意此处的参数名称"parcelLabelNumber",您必须在此处命名与操作中的参数相同。您应该能够在 - http://localhost:23691/api/MissingCardBoxModel/GetTrackingNumber/1245

另外,请看一下一般的路由