【问题标题】:WCF service raises System.IO.InvalidDataExceptionWCF 服务引发 System.IO.InvalidDataException
【发布时间】:2018-06-21 09:33:33
【问题描述】:

我尝试使用 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 内部调用。似乎发生了一些缓冲区溢出。我可以定义一个自定义绑定并禁用压缩,但我想保留它作为最后的手段。

任何线索如何解决这个问题?非常感谢任何帮助!

【问题讨论】:

  • 您是如何将 WSDL 添加到您的项目中的?
  • 我将其添加为服务参考。

标签: c# .net wcf deflate openair


【解决方案1】:

我正在使用 NetSuite SuiteTalk WSDL。我将此添加为 Web 参考,然后将其作为设置添加到我的配置文件中的“applicationSettings”中:

我认为问题在于您与 SOAP 服务的绑定只允许返回一定大小的数据。如果将 WSDL 添加为 Web 引用,则不应应用此限制。我的添加如下:

1) 右键单击​​ WCF 服务中的“引用”并选择“添加服务引用”。

2) 选择“高级”:

3) 添加网页参考:

4) 粘贴您的 WSDL 引用并单击文本字段旁边的箭头。等待 WSDL 出现在文本块中,然后单击“添加引用”。:

我希望这会有所帮助!

【讨论】:

  • 谢谢,这绝对有帮助!但是,我仍然很好奇为什么服务引用会引发此异常。特别是因为将来为什么可能要迁移到 .NET Core 类库(据我所知)不再支持经典的 Web 引用。
  • 我不确定类库是否支持这个。类库可能需要使用 SDK,但 NetSuite 不提供我所知道的任何 SDK。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多