WCF GET Ограничение длины URL-адреса Проблема: неверный запрос - неверный URL-адрес

Я попытался получить доступ к службе WCF через jQuery AJAX-вызов с помощью метода GET. Поэтому иногда URL-адрес длинный с параметрами.

Когда параметры становятся настолько длинными, jQuery AJAX Call терпит неудачу и ничего не возвращает. Поэтому я поставил точку останова и проверил URL-адрес, чтобы проверить. Когда я пытаюсь использовать тот же URL-адрес в браузере (я попробовал FireFox и Chrome), он возвращает следующее, когда длина URL слишком длинная.

Плохой запрос - неверный URL

Ошибка HTTP 400. Недопустимый URL-адрес запроса.

Я также проверил ограничение длины. Когда число символов в URL (в кодированном формате) превышает 1011 символов (включая http://), я получаю ошибку.

У кого-то такая же ситуация и найдено какое-либо решение? Это ограничение по Windows или может ли оно управляться с помощью любых настроек программно?

Я пробовал метод POST, но я не знаю, что я не мог заставить его работать. Потому что ему нужны некоторые изменения в web.config.

ИЗМЕНИТЬ

URL-адрес, который я тестировал для генерации ошибки

http://localhost:64973/Member.svc/SaveMemberWithDetail/%7B%22ID%22%7C%222%22,%22TypeID%22%7C%222%22,%22Title%22%7C%22Mr.%22,%22FirstName%22%7C%22Firnas%22,%22MiddleName%22%7C%22%22,%22LastName%22%7C%22Aliyar%22,%22Gender%22%7C%221%22,%22DateOfBirth%22%7C%222000-01-01%22,%22Nationality%22%7C%22Sri%20Lankan%22%7D/%5B%7B%22AddressLine1%22%7C%22Changed%20Address%20Line1%22,%22AddressLine2%22%7C%22Colombo%22,%22City%22%7C%22Colombo%2010%22,%22State%22%7C%22WP%22,%22PostCode%22%7C%2201000%22,%22CountryID%22%7C%221%22,%22ID%22%7C%227%22,%22TypeID%22%7C%221%22%7D%5D/%5B%7B%22Telephone%22%7C%22015154645%22,%22TypeID%22%7C%221%22%7D%5D/%5B%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2226%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2227%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2228%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2229%22,%22TypeID%22%7C%221%22%7D,%7B%22EmailAddress%22%7C%[email protected]%22,%22ID%22%7C%2229%22,%22TypeID%22%7C%221%22%7D%5D/%7B%7D/481

Некодированная версия URL:

http://localhost:64973/Member.svc/SaveMemberWithDetail/{"ID"|"2","TypeID"|"2","Title"|"Mr.","FirstName"|"Firnas","MiddleName"|"","LastName"|"Aliyar","Gender"|"1","DateOfBirth"|"2000-01-01","Nationality"|"Sri Lankan"}/[{"AddressLine1"|"Changed Address Line1","AddressLine2"|"Colombo","City"|"Colombo 10","State"|"WP","PostCode"|"01000","CountryID"|"1","ID"|"7","TypeID"|"1"}]/[{"Telephone"|"015154645","TypeID"|"1"}]/[{"EmailAddress"|"[email protected]","ID"|"26","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"27","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"28","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"}]/{}/481

Мои параметры заданы объектами Json. Я не думаю, что любой из символов вызывает проблему, потому что, если я просто уменьшу количество буквенных символов до предела, это будет работать.

Я запускаю свое приложение в Visual Studio 2012 Premium в Windows 8 Professional, поэтому он использовал .NET 4.5 и IIS Express.

Дальнейшие исследования

Когда я пытаюсь исследовать это дальше, это не ограничение, о котором я уже говорил, это длина полного URL-адреса. Но в каждом параметре есть ограничение длины, которое составляет 260 символов.

Итак, я не уверен в общей длине URL, но каждый параметр (разделенный на "/" ) имеет ограничение. Проблема с указанным выше URL-адресом, который я опубликовал, - это адрес электронной почты. Параметр JSON имеет длину 261 символ, указанный ниже.

[{"EmailAddress"|"[email protected]","ID"|"26","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"27","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"28","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"},{"EmailAddress"|"[email protected]","ID"|"29","TypeID"|"1"}]

Если я удалю 1 символ из этого, он будет работать.

Ограничено ли это браузером? Ограничение ОС?

ОБНОВЛЕНИЕ: РЕШЕНИЕ

Я нашел решение, которое работало для меня, когда я еще больше изучаю это. Я обновляюсь здесь, так как это может быть полезно для других, которые сталкиваются с этим вопросом.

Это настройка IIS

Проблема заключается в том, что ограничение по умолчанию для каждого параметра в URL REST составляет 260, которое определено в реестре.

Итак, вам нужно обновить реестр, чтобы увеличить ограничение размера, в котором работает IIS Server/IIS Express.

Ниже приведено расположение реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters

И имя значения UrlSegmentMaxLength. Если его нет, создайте его с типом REG_DWORD. И укажите более высокое значение для value data, например 1000 в шестнадцатеричном или 4096 в десятичной форме.

Это настройка http.sys. Подробнее о настройках http.sys: http://support.microsoft.com/kb/820129

Убедитесь, что вы перезагрузите сервер/машину, чтобы применить изменения реестра. И что это.

Ответы

Ответ 1

Отмена обновления как ответа, так как некоторые из вас могут перейти непосредственно в раздел "Ответы".

Я нашел решение, которое работало для меня, когда я еще больше изучаю это. Я обновляюсь здесь, так как это может быть полезно для других, которые сталкиваются с этим вопросом.

Это настройка IIS

Проблема заключается в том, что ограничение по умолчанию для каждого параметра в URL REST составляет 260, которое определено в реестре.

Итак, вам нужно обновить реестр, чтобы увеличить ограничение размера, в котором работает IIS Server/IIS Express.

Ниже приведено расположение реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters И имя значения - UrlSegmentMaxLength. Если его нет, создайте его с типом REG_DWORD. И укажите более высокое значение для данных значений, таких как 1000 в шестнадцатеричном или 4096 в десятичном формате.

Это настройка http.sys. Подробнее о настройках http.sys: http://support.microsoft.com/kb/820129

Убедитесь, что вы перезагрузите сервер/машину, чтобы применить изменения реестра. И что это.

Ответ 2

Несколько вещей, о которых нужно подумать:

1) Вы не должны использовать GET для сохранения данных, используйте POST, когда это возможно. Основная причина связана с безопасностью. Использование GET открывает вам больше потенциальных атак CSRF. Имейте в виду, что POST не защищен CSRF, но его использование немного снижает уязвимость.

2) Глядя на URL-адрес, запятые выглядят неуместными для меня и могут быть причиной того, что вы получаете недопустимые ошибки URL.

3) Какую версию IIS вы используете? Это может определить, что вам нужно сделать, чтобы увеличить максимальную длину URL-адреса.

Для IIS7 вы можете добавить в System.Web в файле конфигурации:

<httpRuntime maxUrlLength="2000" />

EDIT:

Вам следует попробовать снова изменить его на POST, поскольку он не будет пытаться сопоставить его с файловой системой.

Из MSDN окна api разрешают только 260.

В API Windows (с некоторыми исключениями, описанными ниже абзацы), максимальная длина для пути - MAX_PATH, что определяется как 260 символов. Локальный путь структурирован в следующем порядок: буква диска, двоеточие, обратная косая черта, компоненты имени, разделенные обратную косую черту и конечный нулевой символ. Например, максимальный путь на диске D - "D:\some 256-символьная строка пути" где "" представляет собой невидимый завершающий нулевой символ для текущая кодовая страница системы. (Символы < > используются здесь для визуальной ясности и не может быть частью допустимой строки пути.)

Ответ 3

Редактируя реестр, он решил мою проблему с плохим запросом 400, но стиль не работает для меня, пока я не добавлю,

<httpRuntime maxUrlLength="6144" relaxedUrlToFileSystemMapping="true" />

для заметки я попытался добавить эту конфигурацию перед редактированием моего реестре, но это не сработало, поэтому я думаю, что после редактирования Regestry и с этой конфигурацией я настроил ее хорошо. это может помочь кому-то другому.

Ответ 4

Добавление другого ответа только для полноты. В моем случае у меня были все правильные значения в web.config:

    <system.web>
    ...
        <!--Make sure to keep maxAllowedContentLength and maxRequestLength are in Synch-->
        <!--This is for ASP.NET and is in KBytes-->
        <httpRuntime maxRequestLength="50000" maxUrlLength="3000" maxQueryStringLength="3000"/>
    </system.web>
...
  <system.webServer>
    <security>
      <requestFiltering>
        <!--This is for IIS7+ and is in Bytes (Equivalent to 50MB)-->
        <requestLimits maxAllowedContentLength="52428800" maxQueryString="3000" />
      </requestFiltering>
    </security>
  </system.webServer>
...

Тем не менее, я все еще получал ошибку 400 на одном из серверов IIS. После более тщательного исследования и сопоставления конфигурации выяснилось, что модуль IIS UrlScan был виновником. Удалив модуль или отредактировав файл UrlScan.ini для изменения максимальных значений длины, проблема была устранена:

...
[RequestLimits]
MaxAllowedContentLength=104857600
MaxUrl=3000
MaxQueryString=3000

Ответ 5

Вышеупомянутое решение работало для меня с:

maxQueryStringLength = "3000" maxUrlLength = "3000"

И исправление реестра выше.