我想从所有重定向请求中删除查询参数“mobile”。 Redirect.aspx页面将访问者重定向到Default.aspx?mobile = 1。当访问者浏览到重定向,aspx时,最终他应该被引导到Default.aspx,而地址栏中没有参数。 我采取的步骤: 因此,如果当前请求是重定向,我必须从查询字符串中删除查询参数“mobile”。这就是问题:我正在检查状态代码是否为3xx且查询是否具有“移动”参数,但这种情况永远不会等于真。
Redirect.aspx:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Context.Response.Redirect("Default.aspx?mobile=1");
}
RemoveParamModule:
public class RemoveParamModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.EndRequest += RewriteHandler;
}
private void RewriteHandler(object sender, EventArgs eventArgs)
{
var context = (HttpApplication)sender;
var statusCode = context.Response.StatusCode;
if (statusCode.IsInRange(300, 399) && context.Request.QueryString["mobile"] != null)
{
DeleteMobileParameter(context.Request.QueryString);
context.Response.Redirect(context.Request.Path, true);
}
}
private static void DeleteMobileParameter(NameValueCollection collection)
{
var readOnlyProperty = collection.GetType().GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
readOnlyProperty.SetValue(collection, false, null);
collection.Remove("mobile");
readOnlyProperty.SetValue(collection, true, null);
}
public void Dispose()
{
}
}
为什么模块中的请求要么具有statusCode = 302,要么具有'mobile'参数,但不能同时使用?如何删除重定向参数'mobile'?
答案 0 :(得分:1)
Response.Redirect
从服务器为先前请求的URL创建响应。然后,客户端浏览器收到此响应并只获取新URL,该服务器将使用通常的200结果进行处理。
基本上是这样的:
Request: GET Response.aspx
Response: 302 Default.aspx?mobile=1
Request: GET Default.aspx?mobile=1
Response: 200 <body>
因此,如果我正确理解您的需求 - 您不应该从请求网址解析mobile
,而是分析响应。
此外Response.Redirect
可能会抛出ThreadAbortException
,因此请注意同一管道中的多个重定向。