4

私たちはMVC4APIアプリケーションを開発していて、説明のない奇妙な問題に遭遇しました。

APIコントローラーには2つのメソッドがあります。

    [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) ...

2つのメソッドのメソッドシグネチャは明らかに異なりますが、次のエラーメッセージが表示されます。

{"メッセージ": "エラーが発生しました。"、 "例外メッセージ": "リクエストに一致する複数のアクションが見つかりました:[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)タイプ[XXX].API.ArtifactContentController"、" ExceptionType ":" System.InvalidOperationException "、" StackTrace ":" at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\ r \ n at System .Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\ r \ n at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext、CancellationToken cancelToken)\ r \ natSystem.Web.Http.Dispatcher.HttpControllerDispatcher。 SendAsyncInternal(HttpRequestMessage request、CancellationToken cancelToken)\ r \ n at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request、CancellationToken cancelToken) "}

これらの2つの変更のいずれかを行うことでエラーを回避できますが、2つの署名が明らかに異なる場合に、.NETがエラーをスローする理由を本当に知りたいです。

  1. メソッドGet AcceptVerbsから属性を削除しますPost
  2. Get列挙型を整数として受け入れるようにメソッドのシグネチャを変更します
4

1 に答える 1

5

これは、の既知の動作/問題/バグですASP.NET Web API

つまり、アクションセレクター( )は、着信HTTPリクエストをコントローラー内の関連するアクションに一致させようとするときIHttpActionSelectorに考慮されません。Enums

その理由は、デフォルトでは、一致するアクションを見つけるためにプリミティブ型(つまりintstringなど)のみが選択されるためです。はそれらの1つではないため、無視されます。したがって、コンパイラの観点からはアクションのシグネチャが異なっていても、アクションセレクタの観点からは同じです。RouteDataEnum

ここで潜在的な修正の進行状況を追跡できます-http://aspnetwebstack.codeplex.com/workitem/312

とりあえず、あなたが自分で言ったように、最善の回避策は、またはenumとして渡す(そしてにキャストする)ことです。intstringenum

于 2013-01-30T00:43:45.197 に答える