我有一个控制器功能,它接受一个强类型模型作为参数。 当我输入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 }
);
我不知道这是一个错误还是我做错了。
答案 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中的工作方式是:
默认情况下,Web API尝试从URI绑定“简单”参数类型(如int),并尝试从请求正文中读取复杂类型。
详情请见此处:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection