4

我们正在开发一个 MVC4 API 应用程序并且遇到了一个我们无法解释的奇怪问题。

API 控制器有两种方法:

    [AllowAnonymous]
    [AcceptVerbs("Post", "Get")]
    public ArtifactContent Post(string userName, string password, string id) ...

    [AllowAnonymous]
    [AcceptVerbs("Get")]
    public HttpResponseMessage Get(string userName, string password, string id, EnumType contentType) ...

尽管这两种方法显然具有不同的方法签名,但我们收到以下错误消息:

{"Message":"发生错误。","ExceptionMessage":"找到多个与请求匹配的操作:[XXX].Models.ArtifactContent Post(System.String, System.String, System.String) on type [XXX].API.ArtifactContentController\r\nSystem.Net.Http.HttpResponseMessage Get(System.String, System.String, System.String, ArtifactContentTypes)在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) 上的类型 [XXX].API.ArtifactContentController","ExceptionType":"System.InvalidOperationException","StackTrace":"\r\n .Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n 在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancelToken)\r\n 在 System.Web.Http.Dispatcher.HttpControllerDispatcher。 SendAsyncInternal(HttpRequestMessage request, CancellationToken cancelToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancelToken)"}

我们可以通过进行这两个更改之一来解决该错误,但我真的很想知道为什么当两个签名明显不同时.NET 会抛出错误:

  1. 从方法中删除Get AcceptVerbs属性Post
  2. 更改Get方法的签名以接受 Enum 作为整数
4

1 回答 1

5

这是ASP.NET Web API.

简而言之,动作选择器 ( )在尝试将传入的 HTTP 请求与控制器内的相关动作匹配时IHttpActionSelector不会考虑在内。Enums

原因是默认情况下只选择原始类型(即intstringRouteData来查找匹配的操作。Enum不是其中之一,因此它被忽略,因此,即使您的操作从编译器的角度来看具有不同的签名,在操作选择器的眼中它们是相同的。

您可以在此处跟踪潜在修复的进度 - http://aspnetwebstack.codeplex.com/workitem/312

就目前而言,正如您自己所说,最好的解决方法是传递enumintor string(并转换为enum)。

于 2013-01-30T00:43:45.197 回答