C # ASP.NET HttpWebRequest автоматически декодирует амперсанд (&) значения из строки запроса? - PullRequest
3 голосов
/ 08 сентября 2010

Допустим следующий URL:

"http://server/application1/TestFile.aspx?Library=Testing&Filename=Documents & Functions + Properties.docx&Save=true"

Я использую HttpUtility.UrlEncode () для кодирования значения параметра Filename и создаю следующий URL:

"http://server/application1/TestFile.aspx?Library=Testing&Filename=Documents%20%26%20Functions%20%2B%20Properties.docx&Save=true"

Я отправляю следующий (закодированный вариант) запроса от клиента в веб-приложение C #. На сервере, когда я обрабатываю запрос, у меня есть проблема. Переменная HttpRequest содержит частично закодированную строку запроса. То есть, когда я пытаюсь использовать или быстро просмотреть следующие свойства HttpRequest, они имеют следующие значения.

Property = Value
================
HttpRequest.QueryString = "{Library=Testing&Filename=Documents+&+Functions+++Properties.docx&Save=true}"

HttpRequest.Url = "{http://server/application1/TestFile.aspx?Library=Testing&Filename=Documents & Functions + Properties.docx&Save=true}"

HttpRequest.Url.AbsoluteUri = "http://server/application1/TestFile.aspx?Library=Testing&Filename=Documents%20&%20Functions%20+%20Properties.docx&Save=true"

Я также проверил следующие свойства, но все они имеют декодированное значение & value. Однако все остальные значения остаются правильно закодированными (например, пробел равен% 20).

HttpRequest.Url.OriginalString

HttpRequest.Url.Query

HttpRequest.Url.PathAndQuery

HttpRequest.RawUrl

Нет способа правильно прочитать значение параметра Filename. Я что-то упустил?

Ответы [ 4 ]

2 голосов
/ 15 февраля 2012

Я отвечаю на этот вопрос много лет спустя, потому что у меня была эта проблема и я нашел решение.Проблема в том, что HttpRequest.Url не совсем то значение, которое вы дали.HttpRequest.Url является классом Uri, и это значение является значением ToString() этого класса.ToString() для класса Uri декодирует URL.Вместо этого вы хотите использовать HttpRequest.Url.OriginalString.Это кодированная версия URL, который вы ищете.Надеюсь, что это поможет будущему человеку, имеющему эту проблему.

2 голосов
/ 08 сентября 2010

Свойство QueryString возвращает объект NameValueCollection, который сопоставляет ключи строки запроса с полностью декодированными значениями.

Вам необходимо написать Request.QueryString["FileName"].

1 голос
/ 08 сентября 2010

Что происходит, когда вы не используете UrlEncode? Вы не показали, как именно вы используете URL-адрес, который вы создали с помощью UrlEncode, поэтому вполне возможно, что все просто кодируется дважды (многие фреймворки будут автоматически кодировать URL-адреса для вас).

0 голосов
/ 13 сентября 2012

FWIW Я столкнулся с той же проблемой с RavenDB (версия 960). Они реализуют свой собственный объект HttpRequest, который ведет себя так же - он сначала декодирует только амперсанды (от %26 до &), а затем декодирует все значение. Я считаю, что это ошибка.

Несколько способов решения этой проблемы:

  1. Реализация собственного анализа строки запроса на сервере . Это не весело, но эффективно.
  2. Двойное кодирование амперсандов . Сначала закодируйте только амперсанды в строке, затем закодируйте всю строку. (Это простое решение, но не расширяемое, потому что оно ложится бременем на клиента.)
...