3

問題

私の現在のプロジェクトでは、ほぼすべてのアクションに対して、さまざまな HTTP 要求ヘッダーに基づいてさまざまなことを行う必要があります。

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

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

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

  1. クライアントは zip ファイルを要求し、「accept: application/zip」をヘッダーとして渡します。ファイルのリストを取得し、それらを zip ファイルにパックして、クライアントに送り返します。

  2. クライアントは html ページを必要とするため、「accept: text/html」を渡します。サイトは、ファイルを一覧表示した表形式の html ページを返します。

4

4 に答える 4

4

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

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

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

于 2008-09-17T15:48:18.970 に答える
0

この投稿を見る必要があります。http ヘッダーに基づく json および xml 応答の実装について説明します。

于 2009-03-14T02:05:36.033 に答える
0

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

于 2008-09-17T01:13:42.847 に答える
0

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

于 2008-09-17T01:15:29.113 に答える