关于SO(几乎相同的标题)有多个相关的问题,它们都没有帮助我 解决我的问题。请不要在重复之前将我的问题关闭 阅读它。感谢。
我目前正在使用WCF来公开Web服务(SOAP,HTTP)。它现在部署在IIS Express中。我的问题是,我无法从我的客户端使用我的服务。我的客户收到HTTP Error 400 Bad request
个例外。
然后我在服务器端激活了跟踪,看看实际发生了什么,这就是我得到的:
我已将错误消息翻译成英文:The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element.
。
实际上非常不言自明。由于我的SOAP消息很重,它可能超过了64KB的限制。
我决定在绑定配置中扩展此限制。所以这是我的web.config(服务器端):
<services>
<service name="MyServiceName">
<endpoint binding="basicHttpBinding"
bindingConfiguration="MyBindingConfiguration"
bindingNamespace="http://my_namespace"
contract="XXX.IMyContract" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="MyBindingConfiguration"
allowCookies="true"
maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647"
maxBufferPoolSize="2147483647">
<readerQuotas maxDepth="32" maxArrayLength="2147483647" maxStringContentLength="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
如您所见,所有尺寸都设为int.MaxValue
。
我还修改了我的客户端app.config,这里是:
<bindings>
<basicHttpBinding>
<binding name="MyBindingName"
allowCookies="false"
bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647"
maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647"
messageEncoding="Text"
textEncoding="utf-8"
transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32"
maxStringContentLength="2147483647"
maxArrayLength="16384"
maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8083/myAddress.svc"
binding="basicHttpBinding"
bindingConfiguration="MyBindingName"
contract="IMyContract"
name="MyBindingName" />
</client>
然后我重新部署了我的服务,问题仍然存在(客户端HTTP 400, Bad request
+服务器端MaxReceivedMessageSize limited to 65536
)。
然后我用一个非常小的SOAP消息来测试我的服务:一切都很好。所以问题实际上是我的消息大于64KB。
我昨天花了2个小时试图弄清楚我的配置有什么问题...可能是显而易见的事情,但我找不到......
我已经搜索了很多关于这个问题的信息,95%的问题是开发人员忘记在服务端点中指定bindingConfiguration
属性。正如您在上面的web.config中所看到的,对我来说没问题。
然后我找到了another question on stackoverflow about the (almost) same issue。
正如作者在他的问题中所说,将绑定配置的名称设置为string.Empty
“修复了”问题:
<services>
<service name="MyServiceName">
<endpoint binding="basicHttpBinding"
bindingConfiguration=""
...
<bindings>
<basicHttpBinding>
<binding name=""
...
使用默认绑定时,一切正常。我不能使用此解决方法修复我的问题,因为我需要在同一个web.config中指定多个不同的绑定配置。
我在这里重新创建一个问题,因为它实际上并不是相同的条件:我的服务不是自托管的,而是托管在IIS Express中(或IIS 7.5,经过测试,同样的问题)。
我找到了一个similar issue here的自托管服务,问题与这个特殊性有关。所以我认为这两个问题之间有一些不同。
我猜我的配置有些明显错误,但我找不到。 任何帮助表示赞赏。
答案 0 :(得分:4)
乍一看似乎一切都很好 - 唯一的一点是:<service name=".....">
属性必须与完全匹配到完全限定的服务实现类(包括所有名称空间等) - 是那个案子??
我问,因为你有contract="XXX.IMyContract"
表示命名空间,但你的<service name="....">
属性没有暗示任何命名空间。
答案 1 :(得分:0)
尝试使用以下服务中的web-config设置:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"
crossDomainScriptAccessEnabled="true"
maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647"
maxBufferPoolSize="4194304" />
</webHttpEndpoint>
</standardEndpoints>
<bindings>
<webHttpBinding>
<binding>
<readerQuotas maxStringContentLength="2147483647"/>
</binding>
</webHttpBinding>
</bindings>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>