我有这种有趣的情况,我有一个webApi的baseController,并跟踪到这个问题。如果我有一个输入参数类型为Object的基本控制器,那么最终会找到http 500多个动作...
这是使用IISExpress的vs 2012的默认空mvc 4.0项目
public class BaseSecureApi : ApiController
{
public string Wtf(object ohMyGodThisIsSilly)
{
return null;
}
}
和控制器
public class Default1Controller : BaseSecureApi
{
// GET api/default1
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// POST api/default1
[HttpPost]
public string Post([FromBody]string value)
{
return "Postmyvalue:" + value;
}
}
和路线
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
现在为什么路由会变得混乱。 IRL基类根据登录的人以及结果是否应加密返回httpResponse。
答案 0 :(得分:1)
从ASP.NET站点上的routing-and-action-selection article:
HTTP方法。框架仅选择与请求的HTTP方法匹配的操作,确定如下:
- 您可以使用以下属性指定HTTP方法:AcceptVerbs,HttpDelete,HttpGet,HttpHead,HttpOptions,HttpPatch,HttpPost或HttpPut。
- 否则,如果控制器方法的名称以“Get”,“Post”,“Put”,“Delete”,“Head”,“Options”或“Patch”开头,那么按照惯例,操作支持HTTP方法。
- 如果以上都不是,则该方法支持POST。
醇>
这意味着Wtf方法将支持POST,因为它是一个公共方法,没有属性,也不以任何常规词开头。
如果您使Wtf方法受到保护并且Web api不会调用它,您仍然可以从您需要的派生类的方法中调用它。