Как узнать, когда вызывается операция WCF? - PullRequest
0 голосов
/ 16 марта 2011

У меня есть операция WCF, подобная этой,

public bool SubmitDocument(byte[] document)

Таким образом, идея заключается в том, что вызывающая сторона сериализует документ и вызывает вышеуказанную операцию. Затем он помещается в нашу базу данных.

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

Есть ли способ «регистрировать», когда эти данные начинают загружаться на сервер, а также отлавливать ошибку, если это не удается на полпути? У меня возникла проблема с документами, размер которых составляет около 4 МБ, и в некоторых случаях моя служба WCF даже не регистрирует, что кто-то пытается вызвать эту операцию.

Я увеличил ограничение размера загрузки, как это,

<wsHttpBinding>
    <!-- The upload limit should be 5 Mb, rounding up to 6 Mb just to be sure -->
    <binding name="CarWebserviceBinding" maxReceivedMessageSize="6291456">
      <security mode="None">
      </security>
      <!-- The upload limit should be 5 Mb, rounding up to 6 Mb just to be sure -->
      <readerQuotas maxArrayLength="6291456" />
    </binding>
  </wsHttpBinding>

В целом проблема заключается в том, что третья сторона вызывает вышеуказанную операцию WCF (SubmitDocument), и документ никогда не доходит до нашей цели, если она превышает 4 МБ.

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Вы превышаете размер размера буфера по умолчанию для сообщений WCF. Возможно, вам нужно узнать о TransferMode Streamed. Есть вопрос об этом здесь WCF HttpTransport: потоковый и буферизованный TransferMode

2 голосов
/ 18 марта 2011

Я нашел ответ здесь,

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/f6541134-2e08-4eb9-987b-2158fb99b403

Итак, существуют различные ограничения WCF, которые я уже правильно обработал, вот так:

<wsHttpBinding>
  <!-- The upload limit should be 5 Mb, rounding up to 6 Mb just to be sure -->
  <binding name="CarWebserviceBinding" maxReceivedMessageSize="6291456">
    <security mode="None">
    </security>
    <!-- The upload limit should be 5 Mb, rounding up to 6 Mb just to be sure -->
    <readerQuotas maxArrayLength="6291456" />
  </binding>
</wsHttpBinding>

НО чтоЯ НЕ сделал этого,

<system.web>
  <httpRuntime maxRequestLength="16384" /> <!-- 16MB -->
</system.web>

IIS имеет ограничение по умолчанию около 4 МБ для любых входящих запросов http. Указанные выше настройки переопределяют это ограничение.

Еще одна вещь, которую стоит упомянутьэто то, что я добавил это в свой web.config, чтобы включить трассировку,

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

И в журнале ошибок обнаружена ошибка,

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