【问题标题】:Why are these two API methods generating a conflict为什么这两个 API 方法会产生冲突
【发布时间】:2013-01-29 20:15:52
【问题描述】:

我们正在开发一个 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) 类型 [XXX].API.ArtifactContentController\r\nSystem.Net.Http.HttpResponseMessage Get(System.String, System.String, System.String, ArtifactContentTypes) 类型 [XXX].API.ArtifactContentController","ExceptionType":"System.InvalidOperationException","StackTrace":" 在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext 控制器上下文)\r\n 在 System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext 控制器上下文)\r\n 在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancelToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage 请求,CancellationToken cancelToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage 请求,CancellationToken cancelToken)"}

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

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    这是ASP.NET Web API 中的已知行为/问题/错误。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 1970-01-01
      • 2019-10-11
      • 2022-09-23
      • 2016-12-16
      • 2021-01-09
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      相关资源
      最近更新 更多