我尝试使用 WCF 客户端从 .NET 控制台应用程序连接到 NetSuite OpenAir API。我通过添加服务连接并使用以下 WSDL 生成了代理:http ://sandbox.openair.com/wsdl.pl?wsdl&style=document
只要 HTTP 响应不超过特定大小,登录和读取数据就可以正常工作。发生这种情况时会发生 System.IO.InvalidDataException。异常消息是“块长度与其补码不匹配”。
这些是异常详细信息:
System.IO.InvalidDataException
HResult=0x80131501
Message=Block length does not match with its complement.
Source=mscorlib
StackTrace:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at TestService.OASandbox.OAirServiceHandler.read(readRequest1 request)
at TestService.OASandbox.OAirServiceHandlerClient.TestService.OASandbox.OAirServiceHandler.read(readRequest1 request) in TestService\Connected Services\OASandbox\Reference.cs:line 43089
at TestService.OASandbox.OAirServiceHandlerClient.read(SessionHeader SessionHeader, ReadRequest[] method) in TestService\Connected Services\OASandbox\Reference.cs:line 43096
at TestService.Program.Main() in TestService\Program.cs:line 105
我使用 Fiddler 来找出转折点是什么。当 HTTP 响应的 Content-Length 大于 10000 字节时,似乎会引发异常。响应本身是完全完整的:当我使用 Fiddler 分析它时,它可以被破译(因为它是一个 SSL 连接)并且由 OpenAir 发回的完整 XML 被显示出来。所以它必须是.NET代码的问题。
WCF 绑定在我的 app.config 中定义如下:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="OAirServiceSoapBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647">
<security mode="Transport" />
<readerQuotas maxDepth="200" maxStringContentLength="83886089" maxArrayLength="163841" maxBytesPerRead="2147483647" maxNameTableCharCount="16384"/>
</binding>
<binding name="OAirServiceSoapBinding1" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647">
<readerQuotas maxDepth="200" maxStringContentLength="83886089" maxArrayLength="163841" maxBytesPerRead="2147483647" maxNameTableCharCount="16384"/>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://sandbox.openair.com/soapdoc" binding="basicHttpBinding"
bindingConfiguration="OAirServiceSoapBinding" contract="OASandbox.OAirServiceHandler"
name="OAirService" />
</client>
</system.serviceModel>
查看异常,它似乎与 DEFLATE 解压缩算法有关,WCF 在内部调用了该算法。似乎发生了一些缓冲区溢出。我可以定义一个自定义绑定并禁用压缩,但我想保留它作为最后的手段。
任何线索如何解决这个问题?非常感谢任何帮助!