/ HTTPヘッダーに基づいてMVCコントローラーを区別するための最良の方法 - .net、asp.net、asp.net-mvc、ルーティング

HTTPヘッダーに基づいてMVCコントローラを区別する最善の方法 - .net、asp.net、asp.net-mvc、routing

問題

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

現在、私は1つの大規模なコントローラを持っていますそして、すべてのアクションメソッドはActionName属性(同じパラメータを取るが異なることをする同じアクションの複数のバージョンを持つことができるようにする)とカスタムFilterAttribute(PreviewのAcceptVerbsAttributeとほぼ同じように実装される)を持つことができる5)特定のヘッダに特定の値があるかどうかを確認します。

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

たとえば、ファイルのリストがあるとします。サービスは2つの方法のうちの1つで要求を処理しなければなりません:

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

  2. クライアントはhtmlページを望んでいるので、それは "accept:text / html"を渡し、サイトはファイルをリストしたテーブルフォーマットのhtmlページを送り返します。

回答:

回答№1は4

どのヘッダが入ってくるかによって、あなたのアクションとは少し異なる振る舞いをするように思えます。違いをできるだけ分離するようにします。

たとえば、アプリケーションロジックが同じですが、唯一の違いは、レスポンスをユーザーに表示する方法です。Httpヘッダーに基づいてさまざまなアクションを実行するカスタムActionResultを作成することを検討してください。

しかし、論理が完全に異なる場合は、各ルートに付加するカスタムルーティング制約(IRoutConstraint)を実装することができます。アイデアについてはHttpMethodConstraintの実装を見てください。


回答№2の場合は0

私はあなたが別のコントローラベースを必要とするかどうかわからないヘッダーに。この構造は完全に合理的に思えます。あなたのコントローラがあなたが言うように巨大であるなら、それが複数のリソースを扱っているかどうか、そしてもしそうであれば、それはおそらくリソースに基づいて複数のコントローラに分割されるべきですか?


回答№3の場合は0

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


回答№4の場合は0

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