覆盖Request.QueryString

时间:2013-03-16 14:33:48

标签: c# .net override request.querystring

你好经验丰富的开发人员!

我想知道是否有可能以某种方式覆盖.Net Request.QueryString对象?如果可以在不必创建我自己的HTTP模块的情况下完成这将是非常好的。

我的任务是使用RSA(1024)加密我的应用程序中的所有查询字符串。但是,应用程序已经构建,并且有很多地方可以设置查询字符串,所以理想情况下我想做一个全局更改来解密查询并将其放在正常的Request.QueryString中,以便不必更改我的代码无处不在,也许可以将其传递给我团队中的其他开发人员,他们也不必更改代码。

现在,我已经构建了加密对象并使用盐的SessionID来使每个会话的密钥唯一。我也尝试拦截Global.asax中的HTTP请求,以便用解密的查询重写请求路径,然而,这是一个破坏,因为在这些页面上执行的任何回发都将解密的查询字符串放回到POST中,我显然不想要。

所以现在我正处于一个阶段,我想要而不是重写路径,在全局级别拦截或覆盖Request.QueryString对象,并在每次调用此密钥时使用我的解密方法放置,因此再次,不必停止使用Request.QueryString。但是,在网上搜索了几个小时后,我找不到一个如何做到这一点的例子......

如果有人能帮我解决这个问题,我将非常感激!

1 个答案:

答案 0 :(得分: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类仅用于说明目的......实际上,您可以在asp.net Web表单页面或MVC控制器的主体内调用Request。{ExtensionMethod},该控制器已经提供了直接访问HttpRequest对象通过Request属性。

这里有一些关于扩展的信息:

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