检查重定向是否更改查询字符串

时间:2013-11-04 04:59:17

标签: asp.net redirect httpmodule

我想从所有重定向请求中删除查询参数“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'?

1 个答案:

答案 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,因此请注意同一管道中的多个重定向。