Запрос HTTP службы C #, игнорирующий пользовательские значения времени ожидания - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть два приложения, работающие вместе.Первый - это клиент, который общается со вторым, сервисом.Оба написаны на C # /. NET.

У клиента есть веб-страница, которая отправляет форму, основанную на ранее предоставленных данных (также внутри клиента).

Рассматриваемая заявка обрабатываетсясервис.

По большей части отправка в порядке, но в довольно редких сценариях может быть много (200+) элементов для обработки в представлении.Вот тут-то и возникает проблема с тайм-аутом.

Установка блока try / catch, в котором обрабатывается отправка, приводит к следующему:

catching error: System.ServiceModel.FaultException 1[System.ServiceModel.ExceptionDetail]: The HTTP request to 'WSDL SERVICE HERE' has exceeded the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout. (Fault Detail is equal to An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:

Итак, я 'Мы поиграли с файлами Web.config как в клиенте, так и в сервисе, установив теги binding со следующими параметрами:

openTimeout="00:10:00" closeTimeout="00:10:00" sendTimeout="00:10:00" receiveTimeout="00:10:00"

Что странно, если я установлю его на что-нибудьбольше 1 минуты (особенно в клиенте), пользовательские значения не распознаются.Если я установлю значения менее 1 минуты, пользовательские значения будут распознаны.

Я также играл с maxReceivedMessageSize, maxBufferSize и maxBufferPoolSize, но безрезультатно.

Я действительно не думаю, что это связано с логикой в ​​обоих приложениях, так как если бы количество элементов составляло ~ <100, проблем не было.Но мы должны уметь обрабатывать 200+ элементов.</p>

Установка точек останова в обоих приложениях немного помогла, но на самом деле никуда меня не привела.

Любое понимание этого приветствуется.

1 Ответ

0 голосов
/ 28 сентября 2018

Используйте приведенные ниже настройки для сервера и клиента.В нашем сервисе мы используем это для трафика огромного объема данных, кажется, работает для нас.

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <basicHttpBinding>
        <binding name="basicHttp" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Mtom" transferMode="Streamed">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="MyService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp" name="MyService" bindingNamespace="CustomNameSpace" contract="IService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
...