另一个“读取XML数据时已超出最大字符串内容长度配额(8192)。” WCF和Silverlight 4的问题

问题描述 投票:8回答:4

我可以轻松地检索大量数据,但是将其发送回服务会显示此错误。我尝试将元素添加到web.config和servicereferences.clientconfig中,但在任何一个中都无法识别。在某一时刻,我收到一条有关将readerQuotas添加到bindingElementExtensions的消息,但是我找不到如何执行此操作的任何有用信息。我发现有帖子说我必须修改devenv.exe.config之类的,但是要用VS来完成。

编辑

这是web.config的绑定部分:

<bindings>
  <customBinding>
    <binding name="QaRiM.Web.Service1.customBinding0">
      <binaryMessageEncoding />
      <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
    </binding>
  </customBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
  multipleSiteBindingsEnabled="true" />
<services>
  <service name="QaRiM.Web.Service1">
    <endpoint address="" binding="customBinding" bindingConfiguration="QaRiM.Web.Service1.customBinding0"
      contract="QaRiM.Web.Service1" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

和servicereferences.clientconfig:

<configuration>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="CustomBinding_Service1">
                    <binaryMessageEncoding />
                    <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:36533/Service1.svc" binding="customBinding"
                bindingConfiguration="CustomBinding_Service1" contract="ServiceReference1.Service1"
                name="CustomBinding_Service1" />
        </client>
    </system.serviceModel>
</configuration>

均由VS生成。

silverlight wcf
4个回答
9
投票

您只是缺少maximum string content length的配置。

将此添加到绑定属性(客户端和服务器)

<readerQuotas maxStringContentLength="2147483647" />

[抱歉,我没有意识到此子元素位于使用自定义绑定时所使用的编码下,在您的示例中似乎为binaryMessageEncoding。如果没有,请尝试使用该设置的其他编码。

<bindings>
    <customBinding>
        <binding name="QaRiM.Web.Service1.customBinding0">                  
            <binaryMessageEncoding>
                <readerQuotas maxStringContentLength="2147483647"/>
            </binaryMessageEncoding>
        </binding>
    </customBinding>
</bindings>

2
投票

如果读取XML数据时超出了最大字符串内容长度配额(8192)。”设置后甚至忽略了web.config设置您还可以通过创建XmlDictionaryReaderQuotas实例并将MaxStringContentLength设置为2147483647,来解决代码中的问题]

然后只使用XmlDictionaryReaderQuotas的实例,在这里视为mycreatedreaderquota

 XmlDictionaryReaderQuotas mycreatedreaderquota = new XmlDictionaryReaderQuotas();
        mycreatedreaderquota.MaxStringContentLength = 2147483647;

        XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(stream, mycreatedreaderquota);

1
投票

edit:这保存了不完整的草稿,对不起

  1. 同步服务/客户端定义是您要做的,但是必须匹配它们。
  2. 您确定需要自定义绑定吗?您是否尝试过使用ws(Dual)HttpBinding作为基础?
  3. 此帖子可能令人感兴趣:silverlight 3 wcf service configuration -- getting maxreceivedmessagesize error,特别是httpRuntime maxRequestLength =“ 2147483647”设置。
  4. 您可能需要设置maxBufferPoolSizemaxItemsInObjectGraph。链接的SO发布中的配置几乎使所有内容最大化。
  5. 我不知道您使用ChannelFactory客户端代理方法还是服务引用方法,但您可能希望采用以前的方法。在调试会话中,我发现配置中的某些值没有按我所想的那样应用,但是现在我在该主题上的短期记忆已经丢失了。
  6. 在某种程度上与#5有关,您可能会遇到WCF测试客户端问题,其中测试客户端使用了您没有准备好的默认绑定。
  7. [另一个可能感兴趣的帖子:http://www.haveyougotwoods.com/archive/2008/04/14/wcf-message-streaming.aspx

流式传输可能是您在客户端最好的选择,以避开缓冲的transferMode的阻塞性质。我不知道将持续存储多大数据的细节,但是如果您走那条路线,您的服务在客户端上的表现会更好。可以在此处找到关于仅配置客户端以进行流传输的良好入门知识:http://systemmetaphor.blogspot.com/2009/05/using-wcf-to-transfer-large-data-files.html

希望上述帮助的组合


0
投票

您是否尝试过在服务的配置中设置maxStringContentLength?在我的情况下,将其设置为允许Silverlight客户端使用maxStringContentLength的所需值的服务。

请注意,如果允许使用更长的字符串,但不调整maxReceivedMessageSize,则这也会引起问题。确实需要在服务和客户端上都控制maxReceivedMessageSize,因为一个不会从另一个继承值。

© www.soinside.com 2019 - 2024. All rights reserved.