Кодировка URL теряется перед обработкой - ASP.net

Я создаю интернет-магазин, который широко использует кодировку URL.

В моей базе данных есть список отделов и категорий, который я использую для создания ссылок. Они, конечно, закодированы в URL перед отправкой.

Некоторые типичные ссылки:
/MySite/Store/Countertop+Equipment/Can+Openers.aspx
/MySite/Store/Dinnerware.aspx /MySite/Store/Kitchen/Pastry%2f+Decorating.aspx

В моем HTTPHandler я вызываю app.Request.Path, чтобы получить текущий путь. Строка, возвращаемая этим вызовом, больше не кодируется URL-адресом, что не позволяет мне правильно анализировать. После потери кодировки URL-адреса
/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx становится
/ MySite / Store / Kitchen / Pastry / Decorating. aspx.

Это явно нарушает метод преобразования URL-адреса в QueryString.

Кто-нибудь знает, как это исправить?

Вот ядро ​​моего 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);
}

Я очень ценю вашу помощь!


person Kelly Gendron    schedule 13.08.2009    source источник
comment
Ни один из методов или свойств в Request не делает то, что мне нужно ... Похоже, что декодирование может происходить на уровне IIS до того, как .net даже получит в руки запрос. У меня был другой пост, где ~ не отображал правильный путь с закодированными / символами, что, казалось бы, подтверждает это. Грр ... Я не понимаю, в чем смысл URLEncoding, если сервер просто собирается обработать мой URL еще до того, как он достигнет приложения.   -  person Kelly Gendron    schedule 14.08.2009


Ответы (4)


Вы не можете использовать Request.Url (включая Url..PathAndQuery, AbsolutePath и т. Д.), Поскольку его OriginalString уже декодирован.

Таким образом, нет никакого смысла использовать Request.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+Decorating
из:
/ MySite / Store / Kitchen / Pastry% 2f + Decorating .aspx

Кроме того, рассмотрите возможность использования маршрутизации вместо UrlRewrite.

Ура,
Дмитрий.

person Dmytrii Nagirniak    schedule 14.08.2009
comment
Я просмотрел все дерево свойств / методов запроса, и, к сожалению, проблема возникла еще больше, возможно, в IIS. В любом случае, спасибо за подробный ответ, который, по крайней мере, помог мне найти правильный путь. - person Kelly Gendron; 14.08.2009

Попробуйте использовать свойства AbsolutePath или PathAndQuery для объекта Request. Оба они должны поддерживать кодировку URL.

person BStruthers    schedule 13.08.2009

Вы можете UrlEncode URL-адрес перед его анализом. Или еще лучше, сохраните URL-адреса в базе данных без кодирования. Вам даже не нужно их кодировать, если вы используете элемент управления HyperLink.

person Pavel Chuchuva    schedule 14.08.2009
comment
К сожалению, повторное кодирование URL-адреса перед синтаксическим анализом не поможет, поскольку оно закодирует все косые черты, независимо от того, являются ли они частью пути или частью текста. - person Kelly Gendron; 14.08.2009

Оказывается, проблема возникает в IIS еще до того, как .Net получит в свои руки запрос. Похоже, это тупик.

Еще одно предупреждение: мой тестовый сервер IIS (XP) отклонял запросы, содержащие закодированные символы, как угрозу безопасности, и его нельзя было убедить сотрудничать с чем-либо, кроме редактирования реестра. Не уверен, что это относится ко всем версиям, но даже если переменная сервера может быть получена, это кажется еще одной хорошей причиной для использования другой тактики.

Вот следующий вопрос с принятым решением -

Кодирование URL-адресов ASP.Net

person Kelly Gendron    schedule 25.08.2009