ASP.Net: ошибка HTTP 400 неверного запроса при попытке обработать http://localhost:5957/http://yahoo.com

Я пытаюсь создать что-то похожее на diggbar: http://digg.com/http://cnn.com

Я использую Visual Studio 2010 и сервер разработки Asp.

Тем не менее, я не могу заставить сервер разработки ASP обрабатывать запрос, потому что он содержит "http:" в пути. Я пытался создать HTTPModule для перезаписи URL в BeginRequest, но обработчик событий не вызывается, когда URL-адрес http://localhost:5957/http://yahoo.com. Обработчик события вызывается, если URL-адрес http://localhost:5957/http/yahoo.com

Подвести итоги

Есть идеи?

12 ответов

Я написал статью с помощью Стефана, которая объясняет, как это сделать:

Эксперименты с дураками: учет процентов, угловых скобок и других непослушных вещей в URL-адресе запроса ASP.NET/IIS

От Стефана из команды ASP.Net: http://forums.asp.net/p/1431148/3221542.aspx

В текущих версиях ASP.NET URL-адреса, содержащие такие символы, как двоеточие, будут отклонены как потенциальная угроза безопасности. Историческая причина этого заключается в том, что базовая файловая система NTFS поддерживает альтернативные потоки ресурсов, к которым можно получить доступ с помощью имен, таких как "yourfile.txt:hiddendata.txt". Блокировка символа двоеточия в Urls предотвращает случайную работу плохо написанных приложений с альтернативными потоками ресурсов.

В текущих версиях ASP.NET также существует ограничение, заключающееся в том, что входящие URL-адреса должны сопоставляться с файловой системой NTFS для определения данных управляемой конфигурации.

В ASP.NET 4 эти ограничения могут быть удалены. Однако эти изменения внесены в бета- версию ASP.NET 4, а не в бета-версию 1. Мы опробовали URL-адрес, указанный ранее в этом сообщении на форуме, и подтвердили, что с нашими внутренними сборками ASP.NET 4 вы можете использовать этот стиль URL и обрабатывать его без каких-либо ошибок 400.

-Stefan

От Стефана из команды ASP.Net

Из следующего документа "Что нового", посвященного бета-версии 2, я извлек следующее:

ASP.NET 4 представляет новые параметры для расширения диапазона допустимых URL-адресов приложений. Самым простым и полезным изменением является то, что ASP.NET дает разработчикам возможность разрешать более длинные URL-адреса. Предыдущие версии ограничивали длину пути URL до 260 символов (ограничение пути к файлу NTFS). В ASP.NET 4 разработчики имеют возможность увеличить (или уменьшить, если они выберут) этот предел в соответствии со своими приложениями, используя два новых атрибута конфигурации httpRuntime:

Измените значение для "maxRequestPathLength", чтобы разрешить более длинные или короткие пути URL (часть протокола Urls Sans, сервер и строка запроса). Измените значение для maxQueryStringLength, чтобы разрешить более длинные или короткие строки запроса.ASP.NET 4 также позволяет разработчикам настраивать набор символов, используемый проверками символов в URL-адресе ASP.NET. Когда ASP.NET находит недопустимый символ в части пути URL-адреса, он отклоняет запрос с ошибкой HTTP 400. В предыдущих версиях проверки символов Url были ограничены фиксированным набором символов. В ASP.NET 4 разработчики могут настроить набор проверок символов, используя другой новый атрибут конфигурации httpRuntime:

По умолчанию атрибут "requestPathInvalidChars" содержит семь символов, которые считаются недействительными (знаки "меньше" и "больше", а также амперсанд кодируются, поскольку конфигурация представляет собой файл XML). Затем разработчики могут расширить или уменьшить набор недопустимых символов в соответствии с потребностями своего приложения. Обратите внимание, что ASP.NET 4 будет по-прежнему отклонять любые пути URL-адресов, содержащие символы в диапазоне символов ASCII 0x00-0x1F, поскольку они считаются недопустимыми символами Url (RFC 2396 считает эти символы недопустимыми, а на серверах Windows, работающих под управлением IIS6 или выше, http. Драйвер устройства протокола sys также автоматически отклоняет URL-адреса с этими символами).

  • Стефан

У меня была именно эта проблема при создании сокращения URL для ASP.net. На всю жизнь я не мог закодировать двоеточие таким образом, чтобы ASP мог его принять, используя HttpUtility.UrlEncode или escape-(javascript) () на стороне клиента.

Мое решение, что делать с кодировкой Base64. Превращает все это в не спорные буквенно-цифровые числа. Затем вы декодируете на сервере. Я использовал эти функции.

Кроме того, я создал модуль HttpModule, который будет запускаться ведущим дефисом, чтобы я знал, как обрабатывать последующие URL-адреса для декодирования. Пинг мне, если вы хотите более подробную информацию.

Это не сбой IIS, это сервер разработки ASP. Попробуйте выполнить развертывание в IIS и посмотрите, работает ли он.

Я уверен, что вы могли бы сделать это с переписать IIS. Насколько мне известно, ASP.NET Development Server не может выполнить перезапись, но вы можете попробовать сделать это, используя переписывающее устройство IIS7 или, если у вас более ранняя версия, фильтром перезаписи IAPIC ISAPI.

Пытаться HttpUtility.UrlPathEncode(url) - Документы MSDN

Вам нужно использовать HttpUtility.UrlEncode в вашей строке перед перенаправлением на нее.

Я ответил на аналогичный вопрос здесь.

/questions/13104425/dvoetochie-v-kodirovke-url-razreshaetsya-v-400-nevernyih-zaprosah/13104429#13104429

По сути, ASP.net принимает только закодированные символы, такие как двоеточие, после знака вопроса. К счастью, ASP.net MVC автоматически отображает и / api / people / xxxx и / api / people? Id = xxxx в отображении по умолчанию, так что я в итоге и сделал.

Я не уверен, какой веб-сервер использует digg, но держу пари, что это просто невозможно с IIS или встроенным веб-сервером для VS. Скорее всего, это веб-сервер, который можно изменить, чтобы разрешить все виды дурацких URL.

В статье базы знаний 826437 ( http://support.microsoft.com/kb/826437) содержится ответ на ваш вопрос.

  1. Убедитесь, что на компьютере установлен Microsoft .NET 1.1 SP1
  2. В разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET создайте 32-битное значение DWORD VerificationCompatibility = 1
  3. Перезагрузите IIS.

Это сработало для меня (IIS 6, ASP.NET 4), возможно, это будет работать и для вас

Быстрое решение для среды разработки:

  • Измените свойства веб-проекта на "Использовать локальный сервер IIS" и установите флажок "Использовать IIS Express" (при этом сохраняется URL-адрес VS Dev Server).

  • Добавьте следующий параметр в Web.config внутри <system.web>:

    <httpRuntime requestPathInvalidCharacters="" />
    

Для производственного развертывания примите во внимание соображения безопасности, упомянутые в других ответах.

Другие вопросы по тегам