我有一个wcf webHttp端点并且今天注意到当调用带有长URL的httpGet时,总共有364个字符(http://等等),IIS会抛出400个错误的请求错误。在代码中抛出一个断点永远不会到达。如果我删除一些参数并且网址为354,则Web服务按预期运行。
我不确定问题出在哪里,因为网址可能像2k一样。我没有发布任何数据,所以我认为我没有像here那样达到4mb的限制
是什么给出了?
这是一些wcf xml的东西。
<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>
我刚刚删除了回调函数名称,这显着减小了网址的大小,但仍然引发了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);
问题在于attributeList,它可以是逗号分隔列表。
所以使用像
这样的网址调用 它破灭了。但如果我缩短了返回属性文本,那么它就能正常运行。I've added I added the following entry into the registry:
Key Name: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters
Class Name: <NO CLASS>
Last Write Time: 1/25/2011 - 3:34 PM
Value 0
Name: UrlSegmentMaxLength
Type: REG_DWORD
Data: 0x200
我添加它后重启了机器,但仍然收到同样的错误。这是修改WCF和IIS正在使用的HTTP.sys设置的正确位置吗?有没有办法测试WCF是否受此注册表值的影响?
这是一篇没有回答的相关帖子,但是说httpsys的东西没有修复我们正在使用的64位服务器。
答案 0 :(得分:3)
要解决我们的问题,我们必须使用.NET 4.0框架。我们将Web服务移动到.net 4.0应用程序池下运行,并将目标框架更改为4.0。这导致网站吐出url太长错误而不是一个错误的请求。在
中添加Web配置条目后<system.web>
添加了
<httpRuntime maxUrlLength="500" />
对于最大网址长度,服务已按预期启动并运行。
答案 1 :(得分:1)
WCF使用HTTP.sys来处理HTTP流量。 HTTP.sys具有系统范围的设置来处理URL周围的各种限制。你可能会碰到其中一个。
请参阅以下文章以了解这些设置: http://support.microsoft.com/kb/820129
您需要重新启动http服务和WCF服务。如果它托管在IIS中,请重新启动IIS。 UrlSegmentMaxLength似乎对您的URI模板很有意思。