你好经验丰富的开发人员!
我想知道是否有可能以某种方式覆盖.Net Request.QueryString对象?如果可以在不必创建我自己的HTTP模块的情况下完成这将是非常好的。
我的任务是使用RSA(1024)加密我的应用程序中的所有查询字符串。但是,应用程序已经构建,并且有很多地方可以设置查询字符串,所以理想情况下我想做一个全局更改来解密查询并将其放在正常的Request.QueryString中,以便不必更改我的代码无处不在,也许可以将其传递给我团队中的其他开发人员,他们也不必更改代码。
现在,我已经构建了加密对象并使用盐的SessionID来使每个会话的密钥唯一。我也尝试拦截Global.asax中的HTTP请求,以便用解密的查询重写请求路径,然而,这是一个破坏,因为在这些页面上执行的任何回发都将解密的查询字符串放回到POST中,我显然不想要。
所以现在我正处于一个阶段,我想要而不是重写路径,在全局级别拦截或覆盖Request.QueryString对象,并在每次调用此密钥时使用我的解密方法放置,因此再次,不必停止使用Request.QueryString。但是,在网上搜索了几个小时后,我找不到一个如何做到这一点的例子......
如果有人能帮我解决这个问题,我将非常感激!
答案 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属性。
这里有一些关于扩展的信息: