Длина URL-адреса WCF вызывает ошибку IIS 400 Bad Request
У меня есть конечная точка WCF webHttp, и сегодня я заметил, что при вызове httpGet с длинным url-адресом ~364 полных символа (подсчитано http:// etc) IIS выдает ошибку 400 bad request. Создание точки останова в коде никогда не достигается. Если я удаляю некоторые параметры и у меня есть url-адрес, равный 354, веб-служба запускается, как и ожидалось.
Я не уверен, где проблема, так как URL-адреса могут быть как 2k. я не публикую никаких данных, поэтому я не думаю, что я достигаю предела 4 МБ, как от здесь
Что дает?
Вот некоторые xml-файлы wcf.
<behaviors>
<endpointBehaviors>
<behavior name="REST">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<endpoint address="" behaviorConfiguration="REST" binding="customBinding" bindingConfiguration="jsonpBinding" contract="Interface"/>
<bindings>
<customBinding>
<binding name="jsonpBinding">
<jsonpMessageEncoding/>
<httpTransport manualAddressing="true"/>
</binding>
</customBinding>
</bindings>
<extensions>
<bindingElementExtensions>
<add name="jsonpMessageEncoding" type="Microsoft.Ajax.Samples.JsonpBindingExtension, service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bindingElementExtensions>
</extensions>
Я только что удалил имя функции обратного вызова, что значительно уменьшило размер url-адреса, и он все еще выдавал ошибку 400. Это заставляет меня думать, что существует ограничение размера WCF на текст, который может быть отправлен в качестве строкового параметра.
Вот; некоторые контрактные вещи
[OperationContract]
[WebGet(UriTemplate = @"{userName}/layer({layerName})returnAttributes({attributeList})where({attributeName})({op})({attributeValue})", ResponseFormat = WebMessageFormat.Json)]
[JSONPBehavior(callback = "callback")]
DojoGrouping GetAttributes(string userName, string layerName, string attributeList, string attributeName, string attributeValue);
Проблема заключается в атрибутивном списке, который может быть разделен запятыми.
Так и с вызовом url как
Это перебор. Но если я сокращаю текст возвращаемого атрибута, то он функционирует правильно.
I've added I added the following entry into the registry:
Key Name: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesHTTPParameters
Class Name: <NO CLASS>
Last Write Time: 1/25/2011 - 3:34 PM
Value 0
Name: UrlSegmentMaxLength
Type: REG_DWORD
Data: 0x200
Я перезагрузил машину после ее добавления и по-прежнему получаю ту же ошибку. Является ли это правильным местом для изменения HTTP.sys настройки, которые WCF и IIS используете? Существует ли способ проверить, влияет ли на WCF это значение реестра?
Вот связанный пост без ответа, но говорящий, что материал httpsys не исправил 64-битный сервер, который мы используем.
2 ответов:
Чтобы решить эту проблему, нам пришлось использовать платформу .NET 4.0. Мы перешли на веб-службу для запуска под .net версии 4.0 приложение, бассейн и изменить целевую платформу для 4.0. Это привело к тому, что сайт выплюнул url-адрес слишком длинной ошибки вместо просто плохого запроса. После добавления записи web config в
<system.web>Добавлено
<httpRuntime maxUrlLength="500" />При максимальной длине url-адреса служба работает должным образом.
WCF использует HTTP.sys для обработки HTTP-трафика. HTTP.sys имеет общесистемные настройки для обработки различных ограничений вокруг URL. Возможно, вы попали в одну из них.
Смотрите следующую статью, чтобы узнать эти настройки: http://support.microsoft.com/kb/820129
Необходимо перезапустить службу http и службу WCF. Если он размещен в IIS, перезапустите IIS. UrlSegmentMaxLength кажется интересным для вашего шаблона URI.
Comments