测试URL和查询字符串是否有效

时间:2010-05-13 18:20:50

标签: c# asp.net

测试网址和广告的最佳方式是什么?查询字符串有效吗?例如,在登录重定向后,我想确保目标URL有效。如果没有,请转到默认页面。

我们似乎遇到了查询字符串的问题,从“ReturnUrl =”开始,被复制并引发异常。我们宁愿让它进入默认页面。

2 个答案:

答案 0 :(得分:1)

这是一个太长ReturnUrl个查询字符串参数的解决方法。事实是,如果在追加新的RedirectUrl参数之前在查询字符串中存在某些内容(例如,通过使用FormsAuthentication.RedirectToLoginPage方法),则会对其进行编码并将其分配给新的RedirectUrl参数。

这个想法是从查询字符串中删除不必要的(旧ReturnUrl参数)。为此,我在Application_EndRequestglobal.asax属性中使用了Response.RedirectLocation

因此,如果重定向响应并且当前网址包含ReturnUrl参数,则应将其从重定向位置移除(因为它没有意义)。

// parameter key
private static readonly string ReturnUrlParameter = "ReturnUrl";

protected void Application_EndRequest(object sender, EventArgs e)
{
    if (Response.IsRequestBeingRedirected)
    {
        Uri redirectUrl;
        if (Uri.TryCreate(Response.RedirectLocation, UriKind.RelativeOrAbsolute, out redirectUrl))
        {
            redirectUrl = MakeAbsoluteUriIfNecessary(redirectUrl);
            Uri currentUrl = Request.Url;
            var currentQueryParameters = 
                    HttpUtility.ParseQueryString(HttpUtility.UrlDecode(currentUrl.Query));
            // the parameter is present in the current url already
            if (currentQueryParameters[ReturnUrlParameter] != null)
            {
                UriBuilder builder = new UriBuilder(redirectUrl);
                builder.Query = 
                        HttpUtility.UrlDecode(builder.Query)
                            .Replace(Request.Url.Query, string.Empty).TrimStart('?');

                Response.RedirectLocation = 
                        Request.Url.MakeRelativeUri(builder.Uri).ToString();
            }
        }
    }
}

private Uri MakeAbsoluteUriIfNecessary(Uri url)
{
    if (url.IsAbsoluteUri)
    {
        return url;
    }
    else 
    {
        Uri currentUrl = Request.Url;
        UriBuilder builder = new UriBuilder(
                currentUrl.Scheme, 
                currentUrl.Host, 
                currentUrl.Port
            );

        return new Uri(builder.Uri, url);
    }
}

对于URL解析和构建System.Uri将是最佳选择。

  

URI是a的紧凑表示   您的应用程序可用的资源   在Intranet或Internet上。乌里   class定义属性和   处理URI的方法,包括   解析,比较和组合。该   Uri类属性是只读的;至   创建一个可修改的对象,使用   UriBuilder课程。

答案 1 :(得分:0)

我想你可以提取URL,对其进行解码,然后将其加载到“Uri”类型中。这会告诉你它是否结构合理。