WP7:在WebService调用中序列化字符串时出错

时间:2011-02-22 22:11:35

标签: c# windows-phone-7 maxstringcontentlength

当我尝试使用WP7将内容发送到Web服务时,我收到此错误。

  

格式化程序在尝试反序列化消息时抛出异常:反序列化操作“SubmitMobileData”的请求消息正文时出错。读取XML数据时已超出最大字符串内容长度配额(8192)。通过更改创建XML阅读器时使用的MaxStringContentLength对象上的XmlDictionaryReaderQuotas属性,可以增加此配额。第178行,第21位。

我认为它不是我的网络服务。它实际上是我的WP7试图序列化XML内的数据。我的问题是如何在我的WP7应用程序中设置XmlDictionaryReaderQuotasMaxStringContentLength属性。我知道如何在桌面应用程序的客户端和Web服务中设置它。但我无法将其设置在WP7 App的App.XAML文件中。

编辑:我在下面发布了client.config。我决定保留服务地址,以便那些想要了解连接服务的人。当希望回答这个问题时,我将删除wcf连接。

<configuration>

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IMobileUtilities" maxBufferSize="2147483647" 
                maxReceivedMessageSize="2147483647">
                <security mode="None" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://utopiapimp.com/services/MobileUtilities.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMobileUtilities"
            contract="PimpMobileService.IMobileUtilities" name="BasicHttpBinding_IMobileUtilities" />
    </client>
</system.serviceModel>

2 个答案:

答案 0 :(得分:3)

在以下情况下抛出指定的异常:

  1. 托管网络服务的应用程序未指定maxStringContentLength读者配额(因此使用默认值)或配额设置得太低;
  2. 调用的网络方法的至少一个字符串参数的长度违反了maxStringContentLength读者配额。
  3. 如异常所述,当反序列化操作“ SubmitMobileData ”的请求消息正文时发生错误。

    通常,序列化发生在客户端,而反序列化发生在服务端。因此,必须添加(或更新)Web服务使用的绑定的读者配额,以包含具有足够大的值的maxStringContentLength属性,以使每个SubmitMobileData调用成功。

    修改

    更改服务配置的配置以增加XML元素内容长度限制。不要将其复制到您的配置上,只需将其合并到:

    <system.serviceModel>
        <services>
            <service name="Server.MobileUtilities">
                <endpoint address="http://utopiapimp.com/services/MobileUtilities.svc"
                          binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMobileUtilities"
                          contract="ServiceReferences.IMobileUtilities" />
            </service>
        </services>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IMobileUtilities">
                    <!-- Content of each XML element can be up to 10 million characters. -->
                    <readerQuotas maxStringContentLength="10000000" />
                </binding>
            </basicHttpBinding>
        </bindings>
    </system.serviceModel>
    

    修改: 毕竟我认为这个问题与服务有关。

    如果问题发生在客户端,则会抛出以下异常而不是您获得的异常:

      

    读取XML数据时已超出最大字符串内容长度配额(8192)。通过更改创建XML阅读器时使用的XmlDictionaryReaderQuotas对象的MaxStringContentLength属性,可以增加此配额。

    由于Silverlight程序集是WP7程序集的子集,因此客户端的阅读器配额始终设置为最大值。

    这是XmlDictionaryReaderQuotas类定义的一部分:

    static XmlDictionaryReaderQuotas()
    {
        maxQuota = new XmlDictionaryReaderQuotas(0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff);
    }
    
    public static XmlDictionaryReaderQuotas Max
    {
        get
        {
            return maxQuota;
        }
    }
    

答案 1 :(得分:0)

基本上你想要做的是改变你的WP7应用程序连接的特性吧? 在调用远程方法之前,您必须先创建soapclient对象的实例,然后调用它的OpenAsync()方法。当您对该soapclient进行初始化时,您可以提供System.ServiceModel.Channels.Binding()。如果您以编程方式创建此绑定并在其中设置相应的maxStringContentLength

,该怎么办?