ASP.NET Web API控制器功能在输入未映射的操作路径时执行

时间:2013-07-01 14:03:42

标签: asp.net asp.net-mvc asp.net-web-api

我有一个控制器功能,它接受一个强类型模型作为参数。 当我输入ANY url映射到控制器而不是对post请求的特定操作时, 然后控制器执行此功能,而不是返回404代码。

当我将函数的参数更改为基本类型变量时,不会发生问题。 (我已尝试使用其他强类型模型作为参数,并再次出现问题)

这是功能。

 public class PhoneApiController : ApiController
 {
    [HttpPost]
    public HttpResponseMessage RegisterApp(RegisterAppInfo appInfo)
    {


        var resp = Request.CreateResponse(HttpStatusCode.OK, new
        {
            Success = true,
            AppId = 1000,
            IdAlias = "QAUBC9",
            appInfo = appInfo 
        });
        return resp;

    }
}

所以当我输入例如 本地主机:51464 /原料药/ PhoneApi / Sajsdkasjdklajsasd

函数正常执行。!

我使用的是默认路由配置

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

我不知道这是一个错误还是我做错了。

3 个答案:

答案 0 :(得分:3)

URI /Api/PhoneApi/Sajsdkasjdklajsasd确实与您的路由模板api/{controller}/{id}匹配,{controller}匹配PhoneApi{id}匹配Sajsdkasjdklajsasd。我假设您正在对此URI进行POST。因此,Web API将您的请求映射到控制器类RegisterApp中的[HttpPost]操作方法PhoneApiController

就URI中的垃圾内容而言,它会映射到{id}。但是你的参数是RegisterAppInfo,这是一个复杂的类型,它从请求体而不是URI绑定。这就是为什么它具有复杂类型的原因。简单类型从URI,查询字符串绑定。

如果您将操作方法​​设为public HttpResponseMessage RegisterApp(string id, Abc appInfo),则会看到此id参数已填充“Sajsdkasjdklajsasd”。

答案 1 :(得分:3)

对于MVC 4.5,这是唯一有效的方法

目前有一个bug about this

下面是一个解决方法,以便让以下路线类型起作用

api/{controller}/ //Get All
api/{controller}/{Id} //Get for id 
api/{controller}/{Id}/{Action}/  //Get all for action for controller with Id

您需要执行以下操作。

将您的路由更改为。 (注意默认操作..)

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

在您的控制器中将基本方法更改为

[ActionName("DefaultAction")]
public string Get()
{
}

[ActionName("DefaultAction")]
public string Get(int id)
{
}

[ActionName("SpaceTypes")]
public string GetSpaceTypes(int id)
{
}

现在一切都应该按预期工作了..

感谢Kip Streithorst,for a full explanation

答案 2 :(得分:0)

路由在Web API中的工作方式是:

  1. 首先,它匹配路由模板的URI。在这个阶段,它不是在看你的控制器动作
  2. 然后查找匹配的控制器
  3. 然后它寻找一种方法,其中(a)动作匹配(在这种情况下为POST)和(b)每个简单参数类型与URI中的值匹配。
  4. 如果存在复杂的参数类型,它会尝试从请求正文中读取该参数。
  5. 默认情况下,Web API尝试从URI绑定“简单”参数类型(如int),并尝试从请求正文中读取复杂类型。

    详情请见此处:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection