0

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

4

1 回答 1

1

来自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 调用,您仍然可以在需要的地方从派生类的方法中调用它。

于 2013-08-20T12:21:23.023 回答