BaseController输入参数对象结果找到了与请求匹配的多个操作

时间:2013-08-20 09:57:24

标签: c# asp.net-web-api asp.net-web-api-routing

我有这种有趣的情况,我有一个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。

1 个答案:

答案 0 :(得分:1)

从ASP.NET站点上的routing-and-action-selection article

  

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

     
      
  1. 您可以使用以下属性指定HTTP方法:AcceptVerbs,HttpDelete,HttpGet,HttpHead,HttpOptions,HttpPatch,HttpPost或HttpPut。
  2.   
  3. 否则,如果控制器方法的名称以“Get”,“Post”,“Put”,“Delete”,“Head”,“Options”或“Patch”开头,那么按照惯例,操作支持HTTP方法。
  4.   
  5. 如果以上都不是,则该方法支持POST。
  6.   

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

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