0

我想从所有重定向请求中删除查询参数“mobile”。Redirect.aspx 页面将访问者重定向到 Default.aspx?mobile=1。而当访问者浏览到 Redirect,aspx 时,最终他应该被引导到地址栏中没有参数的 Default.aspx。我采取的步骤:因此,如果当前请求是重定向,我必须从查询字符串中删除查询参数“mobile”。这就是问题所在:我正在检查状态代码是否为 3xx 并且查询是否具有“移动”参数,但此条件永远不会等于真。

重定向.aspx:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    Context.Response.Redirect("Default.aspx?mobile=1");
}

移除参数模块:

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”?

4

1 回答 1

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请求URL 解析,而是分析您的响应

Response.Redirect可能会抛出ThreadAbortException,因此要小心同一管道中的多个重定向。

于 2013-11-04T07:57:28.050 回答