WP7: ошибка сериализации строки в вызове WebService

Я получаю эту ошибку, когда пытаюсь отправить данные в веб-сервис с помощью WP7.

Средство форматирования выдало исключение при попытке десериализовать сообщение: Ошибка при десериализации тела сообщения запроса для операции 'SubmitMobileData'. При чтении данных XML превышена квота на максимальную длину строкового содержимого (8192). Эту квоту можно увеличить, изменив свойство MaxStringContentLength объекта XmlDictionaryReaderQuotas, используемого при создании средства чтения XML. Строка 178, позиция 21.

Я полагаю, что это не мой веб-сервис. На самом деле мой WP7 пытается сериализовать данные внутри XML. Что ж, мой вопрос заключается в том, как установить свойство XmlDictionaryReaderQuotas.MaxStringContentLength в моем приложении WP7. Я знаю, как установить его на клиенте настольного приложения и внутри веб-сервиса. Но я НЕ МОГУ установить его в файле App.XAML приложения WP7.

EDIT: я опубликовал 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>


person SpoiledTechie.com    schedule 22.02.2011    source источник
comment
Да, было ли что-то, что не имело смысла?   -  person SpoiledTechie.com    schedule 28.02.2011
comment
Как выглядит ваш ServiceReferences.ClientConfig? Разместите это здесь. Вы пробовали играть с ним?   -  person decyclone    schedule 01.03.2011
comment
опубликовано через комментарий дециклона   -  person SpoiledTechie.com    schedule 01.03.2011
comment
Измените конфигурацию веб-службы, чтобы увеличить максимальную длину содержимого каждого элемента в сообщении SOAP, получаемом службой. Смотрите сообщение ниже.   -  person Rest Wing    schedule 01.03.2011


Ответы (2)


Указанное исключение возникает, когда:

  1. Приложение, в котором размещается веб-служба, не указало квоту чтения maxStringContentLength (поэтому используется значение по умолчанию) или установлено слишком низкое значение квоты;
  2. Длина по крайней мере одного из строковых аргументов вызванного веб-метода превышает квоту чтения maxStringContentLength.

Как указано в исключении, ошибка произошла при десериализации текста сообщения запроса для операции 'SubmitMobileData'.

Обычно сериализация происходит на стороне клиента, а десериализация — на стороне сервиса. Следовательно, квоты чтения привязки, используемой веб-службой, должны быть добавлены (или обновлены), чтобы содержать атрибут 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). Эту квоту можно увеличить, изменив свойство MaxStringContentLength объекта XmlDictionaryReaderQuotas, используемого при создании средства чтения XML.

Поскольку сборки Silverlight являются подмножеством сборок WP7, квоты чтения на стороне клиента всегда устанавливаются на максимальные значения.

Это часть определения класса XmlDictionaryReaderQuotas:

static XmlDictionaryReaderQuotas()
{
    maxQuota = new XmlDictionaryReaderQuotas(0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff);
}

public static XmlDictionaryReaderQuotas Max
{
    get
    {
        return maxQuota;
    }
}
person Rest Wing    schedule 01.03.2011
comment
к сожалению, несмотря на всю вашу тяжелую работу, клиент WP7 не распознает клиентскую строку ‹readerQuotas maxStringContentLength=10000000 /›. Я думаю, это потому, что Wp7 настолько нов, что они еще не реализовали это .... - person SpoiledTechie.com; 04.03.2011
comment
это ошибка, которую я получаю, когда добавляю эту строку: Нераспознанный элемент 'readerQuotas'. - person SpoiledTechie.com; 04.03.2011

Итак, в основном вы хотите изменить характеристики подключения вашего приложения WP7, верно? Прежде чем вы сможете вызвать удаленный метод, вам сначала нужно создать экземпляр объекта soapclient, а затем вызвать его метод OpenAsync(). Когда вы инициализируете этот soapclient, вы можете предоставить файл System.ServiceModel.Channels.Binding(). Что, если вы программно создадите эту привязку и в ней установите соответствующий maxStringContentLength?

person Leon Krancher    schedule 02.03.2011
comment
Я думал о создании или простом доступе к BasicHttpBinding через client.Endpoint.Binding К сожалению, в WP7 в классе привязки отсутствует коллекция .Elements. Что возвращает client.Endpoint.Binding.CreateBindingElements() в вашем случае? и можете ли вы обновить свойство через эти элементы? - person Leon Krancher; 04.03.2011