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

8
我没有问题获取大量数据,但将其发送回服务时会显示此错误。我尝试在web.config和servicereferences.clientconfig中都添加了<readerQuotas>元素,但两者都无法识别。有一次我收到了关于将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生成的。


你能发布一下你的客户端和服务配置文件的绑定元素吗?同时也需要服务的终结点,因为它应该引用绑定。 - Jab
4个回答

9
你只是缺少最大字符串内容长度的配置。
请在绑定属性中添加此配置(客户端和服务器)。
<readerQuotas maxStringContentLength="2147483647" />

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

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

1
那就是问题所在,它不是一个有效的绑定属性。 - Jim Perry
这也不行。它在服务配置中无效,如果将其放入web.config中,每次调用服务都会使应用程序崩溃。 - Jim Perry
你是否打开了跟踪以查看它为什么会崩溃?这是正确的设置,但你可能需要弄清楚要应用哪种编码。 - Jab
查看WCF跟踪以获取更详细的错误消息。如果失败,它将显示出来。您不应该使用Fiddler来查看异常。 - Jab
WCF跟踪似乎没有比Fiddler更详细的信息。仍然存在将超过8K的XML数据发送到服务的问题。 - Jim Perry

2
如果你设置了最大字符串内容长度配额(8192),但在读取XML数据时仍然出现“已超过配额”,那么它将忽略你的web.config设置。
你还可以通过创建XmlDictionaryReaderQuotas实例并将MaxStringContentLength设置为2147483647来在代码中解决该问题。
然后只需使用此处所见的XmlDictionaryReaderQuotas实例 mycreatedreaderquota 即可。
 XmlDictionaryReaderQuotas mycreatedreaderquota = new XmlDictionaryReaderQuotas();
        mycreatedreaderquota.MaxStringContentLength = 2147483647;

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

1

编辑: 这是一个保存了不完整草稿的抱歉

同步服务/客户端定义是你所做的,但它们匹配绝对是必要的。 你确定你需要自定义绑定吗?你尝试过以ws(Dual)HttpBinding为基础吗? 这篇帖子可能会引起兴趣:silverlight 3 wcf service configuration -- getting maxreceivedmessagesize error,特别是httpRuntime maxRequestLength="2147483647"设置。 你可能需要设置maxBufferPoolSizemaxItemsInObjectGraph。链接SO帖子中的配置几乎将所有内容都最大化了。 我不知道你是否使用ChannelFactory客户端代理方法或服务引用方法,但你可能希望选择前者。在调试会话中,我发现某些来自配置的值并未按照我想象的应用,但我对该主题的短期记忆已经丢失了。 与#5有点相关,你可能会遇到WCF测试客户端问题,其中测试客户端正在使用默认绑定,而你却没有准备好。 另一篇可能感兴趣的帖子是:http://www.haveyougotwoods.com/archive/2008/04/14/wcf-message-streaming.aspx

在客户端,流式传输可能是避免缓冲传输模式阻塞性质的最佳选择。我不知道数据的大小会一直保持多大,但如果您采用这种方式,您的服务在客户端上的表现会更好。有关仅配置客户端以进行流式传输的入门指南可以在此处找到:http://systemmetaphor.blogspot.com/2009/05/using-wcf-to-transfer-large-data-files.html

希望以上内容的某种组合能够帮助到您。


使用WCF跟踪,没有显示任何有用的信息。只有通过Fiddler,我才发现最大字符串内容长度的问题。我只是猜测,但bindingElementExtensions似乎很相关,只是我找不到如何正确添加它的任何信息。 - Jim Perry
在我在谷歌上找到的文档中,引起我的注意的是<httpRuntime maxRequestLength="2147483647 />和maxItemsInObjectGraph。前者是因为ASP.NET默认情况下对请求大小有限制,而后者则令人印象深刻,因为它是“唯一一个似乎有所改变的东西”的行为。 - w0rd-driven
虽然您似乎在正确的方向上,但是您应该能够追踪 ASP.NET 中应用程序失败的原因。我只在自托管路线上使用了 WCF,我想说这给了我更多自由来确定类似于此类的奇怪错误,而不必像 ASP.NET 那样受到干扰(尽管在大多数情况下它并不会妨碍)。 - w0rd-driven
1
我知道这个应用程序为什么会失败,问题在于我无法使用已找到的解决方案来修复它。:( - Jim Perry

0

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

需要注意的是,如果您允许更长的字符串,但不调整maxReceivedMessageSize,那么这也可能会导致问题。 maxReceivedMessageSize需要在服务和客户端上进行控制,因为一个不会继承另一个的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接