System.Net.WebException: запрос был прерван: запрос был отменен

У меня есть служба WCF, которая давала мне эту ошибку в условиях загрузки (и, похоже, я не могу воссоздать ошибку). Мы пытались найти способ обойти его около недели, без такой удачи.

Ошибка, которую я вижу, имеет две части,

System.ServiceModel.CommunicationException: Ошибка: (Запрос был прерван: запрос был отменен.) произошло при передаче данных по http канал.

и

System.Net.WebException: запрос был прерван: запрос был отменен.

Я видел, как многие люди предлагают отключить работу, сохраняя при этом перегрузку метода в файле Reference.cs и настройке KeepAlive = false, однако наша клиентская сторона использует справочную службу (в дополнение к веб-ссылке) и этот вариант больше не существует.

Еще один вариант, который я видел, это добавить настраиваемое привязку к службе вместо используемого BasicHttpBinding, но это будет беспокоить обратную поддержку веб-службы тем, кто использовал webReference (поскольку CustomBinding не поддерживает SOAP).

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

Ответ 1

Я не думаю, что HTTP keep alive несет ответственность за это. WCF должны быть в состоянии справиться с этим сам по себе, так что соединение HTTP настойчивый распределяется между запросами и, если он истекает (он истекает после того, как 100s бездеятельности) WCF создает новый без стрельбы любое исключение. Если ваше соединение прерывается во время передачи запроса, я ожидаю, что возникнет другая проблема.

Вы можете использовать эту настраиваемую привязку как эквивалентную BasicHttpBinding без поддержки HTTP:

<bindings>
  <customBinding>
    <binding name="NoKeepAlive">
      <textMessageEncoding messageVersion="Soap11" />
      <httpTransport keepAliveEnabled="false" />
    </binding>
  </customBinding>
</bindings> 

Ответ 2

У меня возникла проблема при загрузке больших файлов. Мне пришлось добавить это в web.config веб-служб.

<system.web>
  <httpRuntime maxRequestLength="10240" />

Ответ 3

У меня была такая же проблема. В моем случае я выполнял запросы ASynchronously. Я отправлял несколько сотен запросов на "сервер" от моего клиента. Я/использовал basicHttpBinding. И в настройке app.config свойство openTimeout было установлено на 60 секунд или одну минуту. Как только я установил это на большее число, как 10 минут, проблема исчезла.

Итак, например, я изменил все эти значения в файле app.config:

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IScriptRunHost" closeTimeout="00:10:00"
                    openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"

до 10 минут.