Проблема обработки вызова WCF, который возвращает много данных - PullRequest
1 голос
/ 13 апреля 2011

У меня на сервере запущена служба NetTcp WCF, и клиент, который асинхронно вызывает один из методов этой службы.

Когда сервер возвращает небольшие объемы данных, все становится непросто.Но когда нужно вернуть много данных, клиент в итоге падает, даже не считая исключения.

Из того, что я вижу, сбой происходит почти сразу после того, как сервер возвращает данные.

Есть идеи, как это отладить?Есть ли какие-либо настройки в службе, которые я должен настроить, чтобы позволить мне возвращать большие объемы данных в этом вызове?

Ответы [ 3 ]

1 голос
/ 14 апреля 2011

Мой подход заключается в следующем:

  • разбить данные на несколько вызовов, по сути, страницы, скажем, по 500 строк каждая.Горстка циклов (а не 1) не повредит задержке, но увеличит стабильность
  • Смена сериализатора (здесь я предвзят, но мне нравится protobuf-net), чтобы уменьшить пропускную способностьвызов, в идеале в сочетании с включением MTOM

Это должно уменьшить пропускную способность параллельно различными способами, и исправить проблему.

1 голос
/ 13 апреля 2011

Попробуйте увеличить maxReceivedMessageSize = "SomeMaxSize"

  <binding name="BasicHttp" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        allowCookies="false" bypassProxyOnLocal="true" hostNameComparisonMode="StrongWildcard"
        maxBufferSize="1000000" maxBufferPoolSize="524288" maxReceivedMessageSize="1000000"
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
        useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
    </binding>

Вы также можете включить трассировку для своего сервиса, добавив следующий раздел в web.config.

<system.diagnostics>
<sources>
  <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
    <listeners>
      <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\log\Traces.svclog" />
    </listeners>
  </source>
</sources>

0 голосов
/ 13 апреля 2011

Увеличение максимального размера - не лучшее решение, если в какой-то момент ваш сервис будет размещен в IIS, он потерпит крах.Если вы используете NetTCP bindig, лучший способ сделать это - показать поток через TCP, посмотрите здесь .

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