1

こんにちは、ベテランの開発者仲間です!

何らかの形で .Net Request.QueryString オブジェクトをオーバーライドできるかどうか疑問に思っていましたか? 独自の HTTP モジュールを作成しなくてもこれを実行できれば、非常に便利です。

私は、アプリケーション内のすべてのクエリ文字列を RSA(1024) で暗号化する任務を負っています。ただし、アプリケーションは既に構築されており、クエリ文字列が設定されている場所がたくさんあるため、理想的には、クエリを復号化して通常の Request.QueryString に配置するグローバルな変更を行い、変更する必要がないようにしたいと考えています。コードはどこにでもあり、おそらくそれを私のチーム内の他の開発者に渡すことができ、彼らもコードを変更する必要はありません。

ここで、暗号化オブジェクトを作成し、salt に SessionID を使用してセッションごとにキーを一意にします。また、復号化されたクエリでリクエスト パスを書き換えるために、Global.asax で HTTP リクエストをインターセプトしようとしましたが、それらのページで実行されているポストバックが復号化されたクエリ文字列を POST に戻すため、これは失敗でした。したくない。

だから今、私はパスを書き直す代わりに、グローバルレベルで Request.QueryString オブジェクトをインターセプトまたはオーバーライドし、this[key] への呼び出しが行われるたびにそこで復号化メソッドを使用したい段階にあります。したがって、Request.QueryString の使用をやめる必要はありません。しかし、ウェブで何時間も検索した後、これを行う方法の例が1つも見つかりませんでした...

誰かがこれで私を助けることができれば、私は最も感謝しています!

4

1 に答える 1

0

これを実現する最も簡単な方法は、拡張メソッドを使用することだと思います。おそらく次のようなものです:

    class Program 
{
    static void Main() 
    {
        var decryptedValue = HttpContext.Current.Request.DecryptQueryStringParam("myParam");
    }
}

public static class HttpRequestExtensions 
{
    public static string DecryptQueryStringParam(this HttpRequest extendee, string name)
    {
        // do stuff to decrypt
        return DecryptMethodStub(extendee.QueryString[name]);
    }

    private string DecryptMethodStub(string queryString)
    {
        return "something decrypted the string";
    }
}

上記の Program クラスは説明のみを目的としていることに注意してください...実際には、HttpRequest オブジェクトへの直接アクセスを既に提供している asp.net Web フォーム ページまたは MVC コントローラーの本体内で Request.{ExtensionMethod} を呼び出します。リクエスト プロパティ。

拡張機能に関する情報を次に示します。

http://msdn.microsoft.com/en-us/library/bb383977.aspx

于 2013-12-19T20:00:25.227 に答える