【问题标题】:Communication WCF and silverlight5 with big object与大对象通信 WCF 和 silverlight5
【发布时间】:2012-12-27 22:34:49
【问题描述】:

我是 WCF 和 Silverlight 的新手,有一个带有 Silverlight 客户端和 WCF 服务器的应用程序,它一直运行良好,直到我添加了一个将大对象作为参数的方法。该对象包含 93 个类型为 int、bool、string、enum 的属性。当它阻塞时,WCF 会给出如下错误消息:

The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

没有其他有意义的消息。配置文件中的所有TimeoutBuffersize都已经设置为最大值了。

我已经尝试过另一个包含较少属性的对象...我一个一个添加并且它起作用了。

我发现当有 72 个属性(带有 enum、bool、string、int)时它可以工作,但是当我再添加一个时,它就不再工作了。

到现在为止我一直在苦苦挣扎,非常感谢您帮助我...

【问题讨论】:

  • 您的代码示例可以帮助其他人发现问题所在。
  • 谢谢,这是我第一次在这里提问;)

标签: wcf silverlight


【解决方案1】:

尝试将所有服务器端配额设置为最大值,例如像这样:

<bindings>
  <basicHttpBinding>
    <binding name="MyBasicHttpBinding"
         maxReceivedMessageSize="2147483647"
        >
      <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647"
          maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"  />
      </binding>

  </basicHttpBinding>
</bindings>

 <services>
  <service name="MyWcfService">
    <endpoint address="http://myservice..."
      binding="basicHttpBinding" bindingConfiguration="MyBasicHttpBinding"
      name="MyBasicHttpBinding" contract="IMyContract" />
  </service>
</services> 

【讨论】:

  • 已经喜欢这个 ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas { MaxArrayLength = Int32.MaxValue, MaxBytesPerRead = Int32.MaxValue, MaxDepth = Int32.MaxValue, MaxNameTableCharCount = Int32.MaxValue, MaxStringContentLength = Int32。最大值}
  • 如果您在代码中设置配额,请编辑您的问题以包含您如何设置服务的完整代码。
  • NetTcpBinding tcpbindingResto = new etTcpBinding(SecurityMode.None {CloseTimeout = TimeSpan.FromSeconds(10000),OpenTimeout = TimeSpan.FromSeconds(10000), SendTimeout = TimeSpan.FromMinutes(5000), ReceiveTimeout = TimeSpan.FromSeconds (10000),MaxBufferSize = Int32.MaxValue, MaxReceivedMessageSize = Int32.MaxValue, MaxBufferPoolSize = Int32.MaxValue,ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas{ MaxArrayLength = Int32.MaxValue, MaxBytesPerRead = Int32.MaxValue,MaxDepth = Int32.MaxValue,MaxNameTableCharCount = Int32.MaxValue,MaxStringContentLength = Int32.MaxValue}};
  • 谢谢,但我也想看看你创建的这个绑定 (tcpbindingResto) 实际连接到你的服务的代码。
  • var RestoSvc = new RestoServiceHost(RestoParams, typeof(Medialog.WCF.Internals.Wresto.Data.RestoService), new Uri(baseAddressHttp + RestoParams["Name"]), new Uri(baseAddressTcp + RestoParams [“姓名”])); RestoSvc.AddServiceEndpoint(typeof(Medialog.WCF.Internals.Wresto.Interfaces.IRestoService), tcpbinding, "");
【解决方案2】:

最终我们找到了解决方案,对于那些有同样问题的人: 这是因为 ny 默认值 MaxSessionSize(int the BinaryMessageEncodingBindingElement) NetTcpBinding的最大为2048,不能再添加了,只好改成自定义更大的MaxSessionSize.....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多