WP7: Ошибка сериализации строки в вызове WebService
Я получаю эту ошибку, когда пытаюсь отправить данные на веб-сервис с WP7.
Средство форматирования выдало исключение при попытке десериализации сообщения: ошибка в десериализации тела сообщения запроса на операцию '
SubmitMobileData
". Максимальная квота длины строки содержимого (8192) была превышена при чтении данных XML. Эта квота может быть увеличена путем измененияMaxStringContentLength
собственность наXmlDictionaryReaderQuotas
объект, используемый при создании читателя XML. Строка 178, позиция 21.
Я думаю, это не мой веб-сервис. На самом деле мой WP7 пытается сериализовать данные внутри XML. Ну, мой вопрос, как мне установить XmlDictionaryReaderQuotas
,MaxStringContentLength
собственность в моем приложении WP7. Я знаю, как установить его на клиенте настольного приложения и внутри веб-службы. Но я не могу установить его внутри файла App.XAML приложения WP7.
РЕДАКТИРОВАТЬ: я разместил 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 ответа
Указанное исключение выдается, когда:
- Приложение, в котором размещен веб-сервис, не указано
maxStringContentLength
квота считывателя (поэтому используется по умолчанию) или квота слишком мала; - Длина хотя бы одного из строковых аргументов вызванного веб-метода нарушена
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>
РЕДАКТИРОВАТЬ: Мне кажется, что проблема со службой в конце концов.
Если бы проблема была на стороне клиента, вместо полученного вами исключения возникнет следующее исключение:
Максимальная квота длины строки содержимого (8192) была превышена при чтении данных XML. Эту квоту можно увеличить, изменив свойство MaxStringContentLength в объекте XmlDictionaryReaderQuotas, используемом при создании средства чтения XML.
Поскольку сборки Silverlight являются подмножеством сборок WP7, квоты считывателей на стороне клиента всегда устанавливаются на максимальные значения.
Это часть определения класса XmlDictionaryReaderQuotas:
static XmlDictionaryReaderQuotas()
{
maxQuota = new XmlDictionaryReaderQuotas(0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff);
}
public static XmlDictionaryReaderQuotas Max
{
get
{
return maxQuota;
}
}
Итак, в основном, что вы хотите сделать, это изменить характеристики вашего соединения с приложением WP7, верно? Прежде чем вы сможете вызвать удаленный метод, вы должны создать экземпляр объекта soapclient, а затем вызвать его OpenAsync()
метод. Когда вы инициализируете этот мыльный клиент, вы можете предоставить System.ServiceModel.Channels.Binding()
, Что, если вы запрограммируете эту привязку программно и в этом наборе maxStringContentLength
?