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

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

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

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

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


person user578809    schedule 17.01.2011    source источник


Ответы (2)


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

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

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

person Marcus    schedule 17.01.2011
comment
Я не использую файл конфигурации, я устанавливаю эти вещи программно, и у меня есть привязка.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max; который устанавливает для элементов, которые вы предложили, непристойно высокие значения. - person user578809; 17.01.2011
comment
У вас установлены эти значения как на сервере, так и на клиенте? - person Marcus; 17.01.2011
comment
Если вышеуказанное не помогает, попробуйте проверить значение ‹httpRuntime maxRequestLength= /›. Значение по умолчанию — 4 МБ, и вы колеблетесь прямо около этого уровня. См. weblogs.asp.net/skoganti/archive/2004/02. /22/78124.aspx - person Marcus; 17.01.2011
comment
Да, и сервер, и клиент. Я попробую maxRequestLength. Спасибо. - person user578809; 19.01.2011

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

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

Спасибо, Роберто

person Roberto    schedule 17.01.2011