IIS 統合リクエスト処理パイプライン - リクエストの変更
-
09-06-2019 - |
質問
IIS 統合要求処理パイプライン モードで実行されている IIS7 で HttpModule を使用して、ISAPI フィルターのような機能を実装したいと考えています。
目標は、受信リクエストを Web サーバー レベルで確認し、カスタム HttpHeaders をリクエストに挿入することです。 (for ex: HTTP\_EAUTH\_ID)
そして、ASPX ページのページ ライフサイクルの後半では、その変数を次のように使用できるはずです。
string eauthId = Request.ServerVariables["HTTP\_EAUTH\_ID"].ToString();
このモジュールを Web サーバー レベルで実装すると、ServerVariables コレクションを変更できますか?
解決
HttpRequest.ServerVariables プロパティは読み取り専用のコレクションです。したがって、それを直接変更することはできません。カスタムデータを次の場所に保存することをお勧めします httpコンテキスト (またはグローバル アプリケーション オブジェクトまたはデータベース) httpmodule から取得し、aspx ページでその共有値を読み取ります。
それでもサーバー変数を変更したい場合は、この記事で説明されているハッキング手法があります。 糸 リフレクションを使用します。
他のヒント
サーバー変数リストには、ブラウザからサーバーに送信されるヘッダーのみが含まれていると思います。
どちらも変更することはできません HttpRequest.Headers
または HttpRequest.ServerVariables
コレクション。ただし、次のいずれかに情報を追加することができます。
HttpContext.Current.Items
HttpContext.Current.Response.Headers
残念ながら、 Request.Params, Request.QueryString, Request.Cookies, Request.Form
(そして、それを詰め込むことを考えられる他のほとんどすべての場所は読み取り専用です。
これが IIS 7 にインストールする予定の HttpModule である場合は、リフレクションを使用しないことを強くお勧めします。. 。このコードが Web サーバーを通過するすべてのリクエストに対して (潜在的に) 呼び出されることを考えると、非常に高速である必要があり、リフレクションだけでは (ユーザーが非常に少ない場合を除き) それを解決できません。
幸運を!