14

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

ошибки я вижу, состоит из двух частей к нему,

System.ServiceModel.CommunicationException: An error: (The request was aborted: the request was cancelled.) occurred while transmitting data over the http channel.

и:

System.Net.WebException: The request was aborted: the request was cancelled.

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

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

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

+0

Вы можете получить доступ к контексту Http и делать то, что хотите. Посмотрите здесь: http://blogs.msdn.com/b/justinjsmith/archive/2007/08/22/setting-http-headers-in-wcf-net-3-5.aspx – Aliostad

ответ

5

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

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

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

Да, это отвечает и я видел это раньше. – Aliostad

+0

Вау, я просто испытал это сам. Какой сюрприз. Спасибо, @Aliostad – Alexandru

+0

@Aliostad Просто из любопытства вы также называете веб-сервис Java на базе Tomcat? – Alexandru

1

У меня была точно такая же проблема. В моем случае я выполнял запросы 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 минут.

4

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

<system.web> 
    <httpRuntime maxRequestLength="10240" /> 
Смежные вопросы