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

C# WebAPI:为什么这些方法与路由模板匹配?,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我只是重新阅读了文档,除非我遗漏了什么,否则默认情况下WebAPI应该只匹配以HTTP谓词开头的方法。那么,为什么在针对/api/mymodels发布帖子时会出现此错误: ExceptionMessage, Multiple actions were found that match the request: Post on type MyApp.Controllers.MyModelController MaterializerFactory on type Pyro.Controllers

我只是重新阅读了文档,除非我遗漏了什么,否则默认情况下WebAPI应该只匹配以HTTP谓词开头的方法。那么,为什么在针对
/api/mymodels
发布帖子时会出现此错误:

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
只有第一个应该匹配。以下是来自my 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) {}
public override JSONAPI.Core.IMaterializer materialerFactory(){}
公共覆盖TM MaterialerFactory(){}
公共重写IQueryable QueryableFactory(Core.IMaterializer materializer=null){}
唯一可能不寻常的是,它们是从我创建的
ApiController
的中间子类继承而来的……尽管我不知道这有什么关系


我的方法都没有任何WebAPI属性(例如,
AcceptVerbs
HttpPost
等)。如果我用
[NoAction]
装饰上面的其中一个,它会从列表中消失……但我不知道为什么它甚至会尝试将方法与这些名称匹配?

Grrrr……好吧,那么我重新阅读了,并在其中埋下了这颗宝石:

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

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


好的,这并不能真正阻止你将代码分解成方法,你只是不能将它们中的任何一个
公开,或者你必须在它们上面加上
[NonAction]
。尽管如此,我还是希望这比“advanced topics”(高级主题)文档中的一句话明显得多。

发现这非常有用,希望这更明确,或者至少行为是可配置的。