3

基本的にヘッダーで指定されたAPIバージョンに基づいてコントローラーを呼び出すWebAPIでいくつかのバージョニング手法を使用しています。したがって、シナリオでは、api / GetSalesHistoryというエントリポイントがありますが、サーバー担当者(私)は、必要な処理を実行するために要求コントラクトを変更する必要がありました。場合によっては、これが重大な変更(新しい必須フィールド、またはリストに変更された単一の値など)になるため、バージョン管理が行われます。

したがって、ルーティングセレクターはヘッダーでAPIバージョンを探してから、正しいコントローラーを呼び出します。バージョン1コントローラーにはバージョン1要求のパラメーター・タイプがあり、バージョン2コントローラーにはバージョン2要求のパラメーター・タイプがあります。

ここに問題があります。箱から出して、コントローラーは送信するペイロードに関係なく実行されます。WCFに戻ると、間違ったオブジェクトを送信すると、シリアル化が失敗し、要求全体が失敗します。現在、バージョン1のペイロードをバージョン2のコントローラーに送信すると、シリアル化に失敗したり、リクエストに失敗したりする代わりに、空のフィールドを持つバージョン2のリクエストのインスタンスが作成され、実行が継続されます。したがって、パラメータはnullとして入力されないため、if(request == null)explode;と単純に言うことはできません。

期待されるペイロードが受信されない場合、コントローラーに要求を拒否させるにはどうすればよいですか?

4

2 に答える 2

1

ModelState.IsValid を使用できることを忘れていました。これは、コンテキストでターゲットに対処します。私は単にチェックします:

if(!ModelState.IsValid) throw
于 2013-01-15T06:01:14.927 に答える
0

逆シリアル化の例外はすべてModelStateに記録され、好きな方法で処理できるようになります。したがって、無効なModelStateをチェックして、適切に処理できるはずです。このブログ投稿はあなたにいくつかのアイデアを与えるかもしれません:

http://blogs.msdn.com/b/youssefm/archive/2012/06/28/error-handling-in-asp-net-webapi.aspx

于 2013-01-04T20:17:13.793 に答える