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。

BaseController输入param Object results in找到多个与请求匹配的操作

来自ASP.NET网站上的路由和操作选择文章:

HTTP方法。框架只选择与请求的HTTP方法匹配的操作,确定如下:

  1. 您可以指定具有属性的HTTP方法:AcceptVerbs、HttpDelete、HttpGet、HttpHead、HttpOptions、HttpPatch、HttpPost或HttpPut
  2. 否则,如果控制器方法的名称以"Get"、"Post"、"Put"、"Delete"、"Head"、"Options"或"Patch"开头,则按照惯例,该操作支持该HTTP方法
  3. 如果以上都不存在,则该方法支持POST

这意味着Wtf方法将支持POST,因为它是一个公共方法,没有属性,也不以任何常规单词开头。

如果您使Wtf方法受到保护,并且它不会被Web api调用,那么您仍然可以在需要的地方从派生类的方法中调用它。