WCF - исключение в клиенте, когда возвращаемые данные становятся большими - PullRequest
0 голосов
/ 17 января 2011

У меня есть сервер WCF.Один из вызовов, которые может сделать клиент, генерирует массив данных в качестве ответа.Каждый элемент данных составляет приблизительно 6 КБ, и кажется, что когда массив становится достаточно большим (около 650 элементов или около того), клиент WCF выдает следующее исключение:

Произошла ошибка при получении ответа HTTPhttp://localhost:8080/TCA/TCAService. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP.Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы).См. Журналы сервера для получения дополнительной информации.

Сервер не выключен и отвечает действительными данными, если я изменяю вызов функции, чтобы вернуть немного меньше данных.Я не уверен, как получить журналы сервера, но это, кажется, исключение на стороне клиента, поэтому я сомневаюсь, что журналы сервера мне вообще помогут.

Я играл с MaxReceivedMessageSize на клиенте, но это не помогает (это в настоящее время в 16 МБ).Есть идеи?ТИА

Ответы [ 2 ]

1 голос
/ 17 января 2011

Я бы тоже проверил

<readerQuotas maxDepth="32" maxStringContentLength="65536" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />

раздел в переплете. Это тоже может иметь значение.
Скорее всего, это maxArrayLength, по умолчанию ~ 16 КБ, и вы получаете около 3900 КБ обратно с 650 элементами по 6 КБ каждый.

0 голосов
/ 18 января 2011

У меня была похожая проблема с размером пакета, но в моем случае размер пакета был больше вашего (и сообщение об ошибке было « Максимальное количество элементов, которые можно сериализовать или десериализовать в графе объектов, равно« 65536 ′ »). Я решил мою проблему с настройкой привязки для моего сервиса. Я публикую ниже всю привязку (обратите внимание читателя Quotas):

<netTcpBinding>
        <binding name="NetTcpBinding_IServiceRequest" 
            closeTimeout="00:01:00"
            openTimeout="00:01:00" 
            receiveTimeout="00:10:00" 
            sendTimeout="00:01:00"
            transactionFlow="false" 
            transferMode="Buffered" 
            transactionProtocol="OleTransactions"
            hostNameComparisonMode="StrongWildcard" 
            listenBacklog="10"
            maxBufferPoolSize="524288" 
            maxBufferSize="2147483647" 
            maxConnections="10"
            maxReceivedMessageSize="2147483647">
            <readerQuotas 
                maxDepth="32" 
                maxStringContentLength="8192" 
                maxArrayLength="2147483647"
                maxBytesPerRead="4096" 
                maxNameTableCharCount="16384" />
            <reliableSession ordered="true" 
                inactivityTimeout="00:10:00"
                enabled="false" />
            <security mode="Transport">
                <transport 
                    clientCredentialType="Windows"
                    protectionLevel="EncryptAndSign" />
                <message clientCredentialType="Windows" />
            </security>
        </binding>
</netTcpBinding>

Надеюсь, это сработает и у вас.

Вот запись из моего блога: Максимальное количество элементов, которые можно сериализовать или десериализовать в графе объектов, составляет '65536'

Спасибо, Roberto

...