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
Подвести итоги
- http://localhost:5957/http/yahoo.com работает
- http://localhost:5957/http//yahoo.com не работает
- http://localhost:5957/http://yahoo.com не работает
- http://localhost:5957/http:/yahoo.com не работает
Есть идеи?
12 ответов
Я написал статью с помощью Стефана, которая объясняет, как это сделать:
От Стефана из команды 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.UrlEncode в вашей строке перед перенаправлением на нее.
Я ответил на аналогичный вопрос здесь.
По сути, ASP.net принимает только закодированные символы, такие как двоеточие, после знака вопроса. К счастью, ASP.net MVC автоматически отображает и / api / people / xxxx и / api / people? Id = xxxx в отображении по умолчанию, так что я в итоге и сделал.
Я не уверен, какой веб-сервер использует digg, но держу пари, что это просто невозможно с IIS или встроенным веб-сервером для VS. Скорее всего, это веб-сервер, который можно изменить, чтобы разрешить все виды дурацких URL.
В статье базы знаний 826437 ( http://support.microsoft.com/kb/826437) содержится ответ на ваш вопрос.
- Убедитесь, что на компьютере установлен Microsoft .NET 1.1 SP1
- В разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET создайте 32-битное значение DWORD VerificationCompatibility = 1
- Перезагрузите IIS.
Это сработало для меня (IIS 6, ASP.NET 4), возможно, это будет работать и для вас
Быстрое решение для среды разработки:
Измените свойства веб-проекта на "Использовать локальный сервер IIS" и установите флажок "Использовать IIS Express" (при этом сохраняется URL-адрес VS Dev Server).
Добавьте следующий параметр в Web.config внутри
<system.web>
:<httpRuntime requestPathInvalidCharacters="" />
Для производственного развертывания примите во внимание соображения безопасности, упомянутые в других ответах.