代码之家  ›  专栏  ›  技术社区  ›  Kelly Robins

URL编码在处理前丢失-asp.net

  •  1
  • Kelly Robins  · 技术社区  · 17 年前

    我正在建立一个广泛使用URL编码的Web商店。

    我的数据库中有一个用于生成链接的部门和类别列表。当然,它们是在发送之前经过URL编码的。

    一些典型的链接是…
    /mysite/store/countertop+equipment/can+openers.aspx
    /mysite/商店/餐具.aspx /mysite/store/kitchen/pastry%2f+装饰.aspx

    在httphandler中,我调用app.request.path获取当前路径。此调用返回的字符串不再是URL编码,这使我无法正确分析。 一旦URL编码丢失
    /mysite/store/kitchen/pastry%2f+装饰.aspx 变成
    /mysite/商店/厨房/糕点/装饰.aspx .

    这显然破坏了将URL转换为查询字符串的方法。

    有人知道怎么解决这个问题吗?

    这是我的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);
    }
    

    我真的很感谢你的帮助!

    4 回复  |  直到 17 年前
        1
  •  2
  •   Dmytrii Nagirniak    17 年前

    不能使用request.url(包括url..pathandquery、absolutepath等),因为其原始字符串已被解码。

    因此没有使用请求的意义。URL,您可以尝试使用以下内容:

    或者在最坏的情况下,您需要解析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);
        }
    

    这显示了如何获取URL:
    /mysite/yourpage.aspx?category1=store&category2=kitchen&category3=pastry%2f+装饰
    来自:
    /mysite/store/kitchen/pastry%2f+装饰.aspx

    另外考虑 using Routing 而不是乌尔雷瓦。

    干杯,
    Dmitriy。

        2
  •  1
  •   BStruthers    17 年前

    尝试请求对象上的绝对路径或路径和查询属性。它们都应该维护URL编码。

        3
  •  0
  •   Pavel Chuchuva grapeot    17 年前

    你可以 UrlEncode 解析前的URL。或者更好的是,保持URL在数据库中不编码。如果使用超链接控件,甚至不需要对它们进行编码。

        4
  •  0
  •   Community Mohan Dere    9 年前

    事实证明,在.NET处理请求之前,该问题就发生在IIS中。这似乎是一个死胡同。

    另一个警告是,我的IIS测试服务器(xp)拒绝了包含编码符号的请求,这是一种安全风险,无法说服它与注册表编辑之外的任何内容合作。不确定这是否适用于所有版本,但即使可以检索到服务器变量,这似乎也是使用不同策略的另一个好理由。

    以下是已接受解决方案的后续问题-

    ASP.Net URL Encoding

    推荐文章