Другое «Превышена максимальная квота длины содержимого строки (8192) при чтении данных XML». проблема с WCF и Silverlight 4 - PullRequest
8 голосов
/ 05 октября 2010

У меня нет проблем с извлечением большого количества данных, но отправка их обратно в службу отображает эту ошибку.Я попытался добавить элемент как в web.config, так и в servicereferences.clientconfig, и он тоже не распознается.В какой-то момент я получил сообщение о добавлении readerQuotas в bindingElementExtensions, но не могу найти ничего полезного о том, как это сделать.Я нашел сообщения о том, что мне нужно изменить файл devenv.exe.config и тому подобное, но это мешало работе VS.Я пытался решить эту проблему в течение двух дней, поэтому любая помощь будет принята.:

<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.

Ответы [ 4 ]

9 голосов
/ 05 октября 2010

Вам просто не хватает конфигурации для максимальной длины содержимого строки .

Добавьте это к своим атрибутам привязки (клиенту и серверу)

<readerQuotas maxStringContentLength="2147483647" />

Извините,Я не осознавал, что этот дочерний элемент находится под кодировкой, используемой при использовании настраиваемой привязки, в вашем примере это binaryMessageEncoding.Если нет, попробуйте другие кодировки с настройкой.

<bindings>
    <customBinding>
        <binding name="QaRiM.Web.Service1.customBinding0">                  
            <binaryMessageEncoding>
                <readerQuotas maxStringContentLength="2147483647"/>
            </binaryMessageEncoding>
        </binding>
    </customBinding>
</bindings>
2 голосов
/ 14 сентября 2012

, если максимальная квота длины строки содержимого (8192) была превышена при чтении данных XML. ”Игнорирует ваши настройки web.config ДАЖЕ после того, как вы установите, вы также можете решить проблему в своем коде, создав экземпляр XmlDictionaryReaderQuotas и установив параметрMaxStringContentLength до 2147483647

, а затем просто используйте экземпляр XmlDictionaryReaderQuotas, рассматриваемый здесь как mycreatedreaderquota

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

        XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(stream, mycreatedreaderquota);
1 голос
/ 06 октября 2010

edit : Это сохранило неполный черновик, извините

  1. Синхронизация определений службы / клиента - это то, что вы сделали, но, безусловно, обязательно, чтобы они совпадали.
  2. Вы уверены, что вам нужно пользовательское связывание? Вы пытались использовать ws (Dual) HttpBinding в качестве базы?
  3. Этот пост может представлять интерес: настройка службы Silverlight 3 wcf - получение ошибки maxreceivedmessagesize , в частности, httpRuntime maxRequestLength = "2147483647" .
  4. Возможно, вам потребуется установить maxBufferPoolSize и maxItemsInObjectGraph . Конфиг в связанном 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 голосов
/ 29 марта 2012

Вы пытались установить maxStringContentLength в конфигурации для службы? В моей ситуации его установка на сервис позволила клиенту Silverlight использовать желаемое значение для maxStringContentLength.

Одно замечание: если вы разрешаете более длинные строки, но не настраиваете maxReceivedMessageSize, это также может вызвать проблемы. maxReceivedMessageSize необходимо контролировать как для службы, так и для клиента, поскольку одно не будет наследовать значения от другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...