我刚刚重新阅读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属性(例如AcceptVerbs
,HttpPost
等)进行修饰。如果我用[NonAction]
装饰上面的一个,它会从列表中消失......但我不知道为什么它甚至试图将这些方法与这些名称相匹配?
答案 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。
好的,所以这并不能阻止你将代码分解为方法,你只能将它们中的任何一个public
组成,或者你必须将[NonAction]
置于其中他们。尽管如此,我希望这比埋在“高级主题”中的子弹更为明显。文档。