HTTP ヘッダーに基づいて MVC コントローラーを区別する最良の方法
-
09-06-2019 - |
質問
問題
現在のプロジェクトでは、ほぼすべてのアクションについて、異なる HTTP リクエスト ヘッダーに基づいてさまざまな処理を実行する必要があります。
現在、大規模なコントローラーが 1 つあり (すべて同じリソース タイプ用)、すべてのアクション メソッドに ActionName 属性があります (これにより、同じパラメーターを受け取り、異なる処理を実行する同じアクションの複数のバージョンを作成できます)。 FilterAttribute (プレビュー 5 の AcceptVerbsAttribute とほぼ同じように実装) は、特定のヘッダーに特定の値があるかどうかをチェックします。
コードを別々のコントローラーにプッシュし、ヘッダーに基づいてそれらの間で RouteTable が選択できるようにしたいのですが、これを行う最もクリーンな方法が思いつきません。
例
たとえば、ファイルのリストがあるとします。サービスは、次の 2 つの方法のいずれかでリクエストを処理する必要があります。
クライアントは zip ファイルを必要とし、「accept:」を渡します。application/zip" をヘッダーとして使用し、ファイルのリストを取得して zip ファイルに圧縮し、クライアントに送り返します。
クライアントは HTML ページを必要としているため、「accept:」を渡します。text/html" を指定すると、サイトはファイルをリストした表形式の HTML ページを送り返します。
解決
どのヘッダーが入ってくるかによって、アクションの動作が若干異なるようです。可能な限り違いを分離しようとします。
たとえば、アプリケーション ロジックが同じで、ユーザーへの応答のレンダリング方法のみが異なる場合は、HTTP ヘッダーに基づいて異なるアクションを実行するカスタム ActionResult を作成することを検討できます。
ただし、ロジックが完全に異なる場合は、各ルートにアタッチするカスタム ルーティング制約 (IRoutConstraint) を実装できます。アイデアとして HttpMethodConstraint の実装を見てください。
他のヒント
ヘッダーに基づいて個別のコントローラーが必要かどうかはわかりません。この構造は完全に合理的に思えます。あなたが言うようにコントローラーが大規模な場合は、複数のリソースを扱っているかどうかを検討し、そうである場合は、リソースに基づいて複数のコントローラーに分割する必要があるのでしょうか。
可能かどうかはわかりませんが、これは AcceptVerbs 属性のようなものになるようです。 プレビュー 5 で追加されました. 。それがどのように実装されたか (MVC ソースを取得) を見て、コンテンツ タイプに基づいて同様のものを追加できるかどうかを確認します。
見るべきです この郵便受け. 。http ヘッダーに基づいた json および xml 応答の実装について説明します。