問題
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 にアップロードされた画像を保存します。MyModel
Upload
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}
質問
ルートをさまざまな順序でいじってみましたが、それで問題が解決するかどうかを確認しました。次の解決策のいずれかに関するヘルプを探しています。
- 私たちのルートの潜在的な問題。
- によるルーティングの代替ソリューション
content-type
。このUpload
アクションは、マルチパート フォームの投稿に対してのみ呼び出す必要があります。コンテンツ タイプが JSON または XML の場合は、通常のアクションを使用する必要があります。これが可能であることを示唆するリソースを見つけることができませんでしたが、他の誰かがこれを検討したことを願っています. - リクエスト コンテンツからファイル ストリームを読み取るためのモデル バインディング アプローチにより、個別の
Upload
アクションはもう必要ありません。