Длина 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 как



Http://../demo/layer(OfficialsLookup)returnAttributes(USHOUSE,US_Photo,US_Web,US_Name,SENDIST,SEN_Name,SEN_Email,SEN_Party,SEN_Photo,REPDIST,REP_Name,REP_Email,REP_Party,REP_Web,REP_Photo)utmX(430)utmY(4502)



Это перебор. Но если я сокращаю текст возвращаемого атрибута, то он функционирует правильно.



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-битный сервер, который мы используем.



Связанный Пост

715   2  

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

    Ничего не найдено.