URL Encoding being lost before processing - ASP.net

拜拜、爱过 提交于 2019-12-13 01:16:53

问题


I am building a web-store that uses URL encoding extensively.

I have a list of Departments & Categories in my database which I use to generate the links. These are, of course, URL encoded before they are sent.

Some Typical Links are...
/MySite/Store/Countertop+Equipment/Can+Openers.aspx
/MySite/Store/Dinnerware.aspx /MySite/Store/Kitchen/Pastry%2f+Decorating.aspx

In my HTTPHandler I call app.Request.Path to obtain the current path. The string returned by this call is no longer URL encoded which is making it impossible for me to parse correctly. Once the URL encoding is lost
/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx becomes
/MySite/Store/Kitchen/Pastry/Decorating.aspx.

This is obviously breaking the method that converts the URL to a QueryString.

Anyone know how to fix this?

Here is the core of my HTTPHandler

public void Init(System.Web.HttpApplication app)
{
    app.BeginRequest += new EventHandler(Application_BeginRequest);
}

private void Application_BeginRequest(object sender, EventArgs e)
{
    System.Web.HttpApplication app = (System.Web.HttpApplication)sender;

    string realUrl = GetRealUrl(app.Request.Path);

    if (!String.IsNullOrEmpty(realUrl))
        app.Context.RewritePath(realUrl, false);
}

I really appreciate your help!


回答1:


You cannot use Request.Url (including Url..PathAndQuery, AbsolutePath etc) as its OriginalString is already decoded.

So there is no point to use Request.Url at all and you can try to play with following:

  • Request.AppRelativeCurrentExecutionFilePath
  • Request.CurrentExecutionFilePath

Or in a worst-case scenario you'll need to parse the Url:

    [Test]
    public void RewriteProoveOfConcept() {
        var path = @"/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx";
        var res = Regex.Replace(path, @"/(.+)/(.+)/(.+)/(.+)\.aspx", @"/$1/YourPage.aspx?category1=$2&category2=$3&category3=$4");
        Assert.AreEqual(@"/MySite/YourPage.aspx?category1=Store&category2=Kitchen&category3=Pastry%2f+Decorating", res);
    }

This shows how you can get the URL:
/MySite/YourPage.aspx?category1=Store&category2=Kitchen&category3=Pastry%2f+Decorating
from:
/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx

Additionally consider using Routing instead of UrlRewrite.

Cheers,
Dmitriy.




回答2:


Try the AbsolutePath or PathAndQuery properties on the Request object. Both of them should maintain the url encoding.




回答3:


You can UrlEncode the URL before parsing it. Or better yet, keep URL's non-encoded in database. You don't even need to encode them if you use HyperLink control.




回答4:


It turns out that the issue is occurring in IIS before .Net even gets its hands on the request. It appears that this is a dead end.

An additional word of warning is that my IIS test server (XP) was rejecting requests containing encoded amperstands as a security risk and could not be persuaded to cooperate with anything short of a registry edit. Not sure if this goes for all versions, but even if a server variable can be retrieved this seems like another good reason to use a different tactic.

Here is the follow-up question with the accepted solution-

ASP.Net URL Encoding



来源:https://stackoverflow.com/questions/1274669/url-encoding-being-lost-before-processing-asp-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!