2

問題

MVC4 Web API Beta から RC に切り替えたところMultiple actions were found that match the request ...、サービスで例外が発生しています。

バックグラウンド

には 2 つのPOSTアクションが定義されていますApiController

public class MyModelController : ApiController
{
    ...
    // POST /mymodel
    public MyModel Post(MyModel model)
    {
       ...
    }

    // POST /mymodel/upload
    [ActionName("Upload")]
    public HttpResponseMessage UploadModelImage()
    {
        HttpRequestMessage request = Request;
        if (!request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType, request));
        }
       ...
    }
}

最初のアクション (デフォルトアクション) は、サービスに渡された JSON からPOST新しいオブジェクトを作成するために使用されます。ポータルのユーザーには、新しいオブジェクトMyModelの作成の一部として画像をアップロードするオプションがあります。この場合、2 番目のアクションを使用してファイルを保存し、新しいオブジェクトをデータベースに永続化します。このアクションは、マルチパート リクエストのコンテンツを読み取り、モデルのプロパティを解析して、CDN にアップロードされた画像を保存します。MyModelUpload

RC に切り替えたので、アップロード アクション (http://www.myapidomain.com/mymodel/upload) は問題なく実行されますが、通常のPOSTアクション (http://www.myapidomain.com/mymodel/) は失敗し、Multiple actions were found that match the request ...上記の両方の方法を競合として引用する例外。

ルートは次のとおりです。

routes.MapHttpRoute(
    "Default", // route name
    "{controller}" // route template
    );

routes.MapHttpRoute(
    "OnlyId", // route name
    "{controller}/{id}", // route template
    new {}, // defaults
    new {controller = @"[^0-9]+", id = @"[0-9]+"} // constraints
    );

routes.MapHttpRoute(
    "OnlyAction", // route name
    "{controller}/{action}", // route template
    new {}, // defaults
    new {controller = @"[^0-9]+", action = ActionNameConstraint.Instance} // constraints
    );

routes.MapHttpRoute(
    "DependantAction", // route name
    "{controller}/{principalId}/{action}/{dependentId}", // route template
    new {dependentId = System.Web.Http.RouteParameter.Optional}, // defaults
    new {controller = @"[^0-9]+", action = ActionNameConstraint.Instance} // constraints
    );

ActionNameConstraint{action}が属している必要があることを保証する単なるカスタム制約です。{controller}

質問

ルートをさまざまな順序でいじってみましたが、それで問題が解決するかどうかを確認しました。次の解決策のいずれかに関するヘルプを探しています。

  1. 私たちのルートの潜在的な問題。
  2. によるルーティングの代替ソリューションcontent-type。このUploadアクションは、マルチパート フォームの投稿に対してのみ呼び出す必要があります。コンテンツ タイプが JSON または XML の場合は、通常のアクションを使用する必要があります。これが可能であることを示唆するリソースを見つけることができませんでしたが、他の誰かがこれを検討したことを願っています.
  3. リクエスト コンテンツからファイル ストリームを読み取るためのモデル バインディング アプローチにより、個別のUploadアクションはもう必要ありません。
4

1 に答える 1

0

デフォルトでは、REST スタイルのルーティングと RPC スタイルのルーティングを単一のコントローラーに混在させることはできません。これは、あなたがやろうとしているようです。

Web API ソースが存在する ASP.NET Web Stack のコードプレックス ( http://aspnetwebstack.codeplex.com/workitem/184 ) には未解決の問題があります。

そのように使用したい場合は、アップロード アクションを別のコントローラーに移動する必要があります。このコントローラーは RPC のみの方法で呼び出されます。

于 2012-09-12T06:55:26.710 に答える