質問

問題

現在のプロジェクトでは、ほぼすべてのアクションについて、異なる HTTP リクエスト ヘッダーに基づいてさまざまな処理を実行する必要があります。

現在、大規模なコントローラーが 1 つあり (すべて同じリソース タイプ用)、すべてのアクション メソッドに ActionName 属性があります (これにより、同じパラメーターを受け取り、異なる処理を実行する同じアクションの複数のバージョンを作成できます)。 FilterAttribute (プレビュー 5 の AcceptVerbsAttribute とほぼ同じように実装) は、特定のヘッダーに特定の値があるかどうかをチェックします。

コードを別々のコントローラーにプッシュし、ヘッダーに基づいてそれらの間で RouteTable が選択できるようにしたいのですが、これを行う最もクリーンな方法が思いつきません。

たとえば、ファイルのリストがあるとします。サービスは、次の 2 つの方法のいずれかでリクエストを処理する必要があります。

  1. クライアントは zip ファイルを必要とし、「accept:」を渡します。application/zip" をヘッダーとして使用し、ファイルのリストを取得して zip ファイルに圧縮し、クライアントに送り返します。

  2. クライアントは HTML ページを必要としているため、「accept:」を渡します。text/html" を指定すると、サイトはファイルをリストした表形式の HTML ページを送り返します。

役に立ちましたか?

解決

どのヘッダーが入ってくるかによって、アクションの動作が若干異なるようです。可能な限り違いを分離しようとします。

たとえば、アプリケーション ロジックが同じで、ユーザーへの応答のレンダリング方法のみが異なる場合は、HTTP ヘッダーに基づいて異なるアクションを実行するカスタム ActionResult を作成することを検討できます。

ただし、ロジックが完全に異なる場合は、各ルートにアタッチするカスタム ルーティング制約 (IRoutConstraint) を実装できます。アイデアとして HttpMethodConstraint の実装を見てください。

他のヒント

ヘッダーに基づいて個別のコントローラーが必要かどうかはわかりません。この構造は完全に合理的に思えます。あなたが言うようにコントローラーが大規模な場合は、複数のリソースを扱っているかどうかを検討し、そうである場合は、リソースに基づいて複数のコントローラーに分割する必要があるのでしょうか。

可能かどうかはわかりませんが、これは AcceptVerbs 属性のようなものになるようです。 プレビュー 5 で追加されました. 。それがどのように実装されたか (MVC ソースを取得) を見て、コンテンツ タイプに基づいて同様のものを追加できるかどうかを確認します。

見るべきです この郵便受け. 。http ヘッダーに基づいた json および xml 応答の実装について説明します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top