5

1 つのコントローラーに複数の POST メソッドを持つコントローラーを実装しようとしています。私は次のものを持っています:

public class PatientController : ApiController
{
    [HttpGet]
    public IEnumerable<Patient> All() { ... }

    [HttpGet]
    public Patient ByIndex(int index) { ... }

    [HttpPost]
    public HttpResponseMessage Add([FromBody]Patient patient) { ... }
}

そして、私は私のルーティングにこれを持っています:

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
    "API_1",
    "{controller}/{index}",
    new { index = RouteParameter.Optional });

すべてが期待どおりに機能します:)

ここで、次のアクションを追加したいと思います。

    [HttpPost, ActionName("save")]
    public void Save(int not_used = -1) { ... }

ルーティングに何も追加しないと、Fiddler に次のエラーが表示されます: 要求に一致する複数のアクションが見つかりました。

これをルーティングに追加した場合 (2 番目または 1 番目として、問題ではありません):

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
    "API_2",
    "{controller}/{action}/{not_used}",
    new { not_used = RouteParameter.Optional },
    new { action = "save|reset" }); // Action must be either save or reset

Fiddler でも同じエラーが発生します。

これは可能ですか?1 つのコントローラーで、異なる (タイプ) パラメーターを持つ複数の POST を使用できますか?

4

2 に答える 2

1

あなたの問題は、 と の 2 つの方法があることですSaveAdd両方とも route に一致しますAPI_1。URL が少し異なっていた場合に一致した可能性のある別のルートがあるという事実API_2は問題ではありません。このルートには 2 つの一致方法があります。

いくつかのオプションがあります:

  1. save メソッドを別のコントローラーに配置し、そのコントローラーに対して常にアクション名をマップします。
  2. Saveデフォルト ルートと一致しないことを確認します。特に、Save にオプションのパラメーターを含めたので、省略してもかまいません。パラメータがオプションではない場合、ルートと一致しません。
  3. メッセージベースの形式を使用するようにアーキテクチャを変更します。つまり、アクションに基づいて区別するのではなく、単に 1 つのクラスを渡し、それがどのように設定されているかに基づいて区別します (Web API では少し珍しいですが、それが機能することです) ServiceStack
  4. ルーティングを変更して、常にアクション名を含めます。

正確なシナリオをよりよく理解しないと、何が最善かは言えません。個人的には、これらすべての引数と複数のアクションで動作する同時ルートを取得するというトリッキーさは避けたいと思います-アクションについて常に明示するか、コードで可能なメッセージに対処します(つまり、オプション3または4)。オプションの引数に直面した複雑なルートは、単に苦痛です。

于 2013-02-21T12:55:09.740 に答える