目标是在用户代码调用Response.Redirect
时拦截并更改浏览器重定向到的URL。要更改此URL,我需要访问Session(存储在Session中的信息告诉我应该在此URL中添加什么。)大多数情况下,我只是在一个环境下向重定向位置附加查询参数。
PreSendRequestHeaders
让我改变Response.RedirectLocation
。没关系。但是,我无法从此处访问会话状态。它显然是在此事件被解雇之前发布的。
所以,我需要一种方法将这些信息传递给PreSendRequestHeaders
;或者我需要另一种方法来实现这一目标。最终我的目标是在查询字符串中添加一个参数,无论浏览器被重定向到何处。
答案 0 :(得分:2)
如果您可以修改写入Session的代码,那么您可以使用Context.Items
。
例如,在Response.RedirectPermanent
方法存在之前,我使用了以下内容:
//in some library
public static void PermanentRedirect(this HttpContext context, string url)
{
context.Items["IsPermanentRedirect"] = true;
context.Response.Redirect(url);
}
//in global.asax
void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
if (Response.IsRequestBeingRedirected && (bool) (Context.Items["IsPermanentRedirect"] ?? false))
{
Response.Status = "301 Moved Permanently";
}
}