WebAPI:为什么这些方法与路由模板匹配?

时间:2014-11-03 11:26:56

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

我刚刚重新阅读Routing in ASP.NET WebAPI文档,除非我遗漏了某些内容,否则默认情况下,WebAPI应该只匹配以HTTP谓词开头的方法。那么为什么在对/api/mymodels执行POST时会出现此错误:

ExceptionMessage, Multiple actions were found that match the request: 
Post on type MyApp.Controllers.MyModelController
MaterializerFactory on type Pyro.Controllers.MyModelsController
MaterializerFactory on type Pyro.Controllers.MyModelsController
QueryableFactory on type Pyro.Controllers.MyModelsController

只有第一个应匹配。以下是我的WebApiConfig.cs的路线:

config.Routes.MapHttpRoute(
    name: "Children",
    routeTemplate: "api/{controller}/{id}/{childroute}/{childid}",
    defaults: new { childid = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

以下是错误匹配方法的签名:

public override JSONAPI.Core.IMaterializer MaterializerFactory() {}

public override TM MaterializerFactory<TM>() {}

public override IQueryable<T> QueryableFactory(Core.IMaterializer materializer = null) {}

关于这些的唯一可能不寻常的事情是它们是从我创建的ApiController的中间子类继承而来的......虽然我不知道这是多么重要。

我的所有方法都没有使用任何WebAPI属性(例如AcceptVerbsHttpPost等)进行修饰。如果我用[NonAction]装饰上面的一个,它会从列表中消失......但我不知道为什么它甚至试图将这些方法与这些名称相匹配?

1 个答案:

答案 0 :(得分:2)

Grrrr ......好吧,然后我重新阅读了Routing and Action Selection in ASP.NET Web API,并埋葬了这个宝石:

  

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

     
      
  • 您可以使用以下属性指定HTTP方法:AcceptVerbs,HttpDelete,HttpGet,HttpHead,HttpOptions,HttpPatch,HttpPost或HttpPut。
  •   
  • 否则,如果控制器方法的名称以&#34; Get&#34;,&#34; Post&#34;,&#34; Put&#34;,&#34; Delete&#34;开头, &#34; Head&#34;,&#34; Options&#34;或&#34; Patch&#34;然后按照惯例,该操作支持该HTTP方法。
  •   
  • 如果以上都不是,则该方法支持POST。
  •   

head...explodes

好的,所以这并不能阻止你将代码分解为方法,你只能将它们中的任何一个public组成,或者你必须将[NonAction]置于其中他们。尽管如此,我希望这比埋在“高级主题”中的子弹更为明显。文档。