BaseController输入param Object results in找到多个与请求匹配的操作
本文关键字:请求 操作 param 输入 Object results in BaseController | 更新日期: 2023-09-27 18:28:15
我遇到了一个有趣的情况,我有一个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。
来自ASP.NET网站上的路由和操作选择文章:
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调用,那么您仍然可以在需要的地方从派生类的方法中调用它。