2015-05-28 5 views
0

Я получаю следующее исключение The operation has timed out при вызове службы WCF REST.Операция завершена WCF Rest

У меня в основном есть проект веб-службы WCF и веб-сайт, который ссылается на скомпилированную сборку WCF. Веб-сервис работает в обаянии, поэтому моя проблема не сводится к неверному определению привязки, конечной точки или сервиса в моем web.config.

Проблема возникает только в том случае, если я пытаюсь вставить большой объем данных.

web.config, содержит следующую информацию:

<system.web> 
    <compilation debug="true" targetFramework="4.0"/> 
    <httpRuntime enable="true" executionTimeout="100000" 
    maxRequestLength="2147483647"/> 
</system.web> 

<bindings> 
    <webHttpBinding> 
    <binding maxReceivedMessageSize="2147483647" 
      maxBufferSize="2147483647" 
      receiveTimeout="00:10:00" 
      sendTimeout="00:10:00"> 
     <readerQuotas maxStringContentLength="2147483647"/> 
    </binding> 
    </webHttpBinding> 
</bindings> 

Мой WCF веб-службы не упоминается в (службы Windows) проект, как я использую обертку (SDK), который ухаживает делает все соответствующие HTTP-запросы и конвертировать объекты в json и наоборот. Весь HTTP-запрос выполняется через WebClient, который называется sdk. В этом случае:

byte[] returnBuffer = await client.UploadDataTaskAsync(uriString, 
"POST", requestBuffer); 

В то время как это происходит на живом сайте (Хлоп !!), я могу легко воспроизвести проблему, поставив точку останова в моем веб-службы и позволяя ему висеть в течение 90 секунд или около того, а затем если я попытаюсь продолжить переход, возникает конкретная ошибка, и пока она пытается продолжить выполнение оставшегося кода внутри функции, исключение возвращается клиенту.

Я уже несколько часов искал эту проблему, но я никуда не денусь. Мой веб-сервис по-прежнему не работает по умолчанию 90 секунд.

Еще одна вещь, о которой мне интересно. Я читал много разных статей, говоря о том, что клиентское приложение, в моем случае, моя служба Windows должна иметь привязку, конечную точку и т. Д. Информацию в app.config. У меня нет никого, и я никогда не нуждался в нем до сих пор. Должен ли я заглянуть в это? На самом деле кажется, что тайм-аут происходит в веб-службе, а не на стороне клиента.

Любые идеи?

Спасибо.

UPDATE:

Я добавил дополнительную информацию о моем web.config (т.е. службы & определения поведения):

<services> 
    <service name="MyCompany.Web.Services.WebDataService" 
       behaviorConfiguration="WebDataServiceBehaviour"> 
    <endpoint address="" binding="webHttpBinding" 
       contract="MyCompany.Web.Services.IWebDataService" 
       behaviorConfiguration="webBehaviour"> 
    </endpoint> 
    </service> 
</services> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="WebDataServiceBehaviour"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="webBehaviour"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
+0

Имя вашего Binding '<связывании имя = "myWebHttpBinding" ...> ... ' и использовать его как это: <адрес конечной точки = "" привязки = "WebHttpBinding" bindingConfiguration = "myWebHttpBinding" Контракт "MyCompany .Web.Services.IWebDataService "/> – adPartage

ответ

0

Я собираюсь ответить на мой собственный вопрос, как я хотел бы уточнить несколько вещей:

  1. Это не имеет ничего общего с наличием недопустимых параметров в сети .config, поскольку проблема связана с клиентской стороной. Легко предположить, что проблема связана с сервером, но в этом случае это было не так.

  2. Нет смысла настраивать конфигурацию ServiceModel (адрес, привязку, контракт) в app.config на стороне клиента, поскольку я вызываю объект WebClient, который, насколько мне известно, полностью не знает тип службы, которую я вызываю, и эти параметры весьма специфичны для WCF, и хотя моя служба является веб-службой WCF REST и для нее требуются параметры ServiceModel на сервере, объект WebClient полностью не знает об этом.

  3. Ответ на мою проблему был найден в статье How can I change the time limit for webClient.UploadData()?. После внесения соответствующих изменений, я тщательно тестирую это, и он также был развернут на реальном сайте, на котором была проблема с тайм-аутом, и проблема была определенно решена при загрузке большого количества данных.

Спасибо.

0

Я бы сказал, это было связано с клиентской стороны тайм-аут установка. У вас есть клиентская конфигурация или какой-либо другой способ настройки оболочки?

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

 <binding openTimeout="00:10:00" 
      closeTimeout="00:10:00" 
      sendTimeout="00:10:00" 
      receiveTimeout="00:10:00"> 

См here for more details

+0

Привет, у меня нет ничего на стороне клиента. Это одна из вещей, о которых мне было интересно. Есть ли шанс показать мне, что я должен устанавливать на стороне клиента? Я даже не уверен, что он будет читать app.config, поскольку помню, что я вызываю WebClient, а не ссылку на веб-службу. – Thierry

+0

Привет, Марк, ты был прав. Я нашел эту статью: http://stackoverflow.com/questions/1237966/how-can-i-change-the-time-limit-for-webclient-uploaddata, и как только я увеличиваю время ожидания моего WebClient, проблема кажется Ушли. Я установил его на 10 минут и оставил его на точке останова более 5 минут и не стал проблемой. Я запускал ту же самую «загрузку» 5 раз, и не однажды получил исходную ошибку или вторую, о которой я упоминал выше, так что выгляжу хорошо, но мне придется подождать и посмотреть, как это будет с клиентом завтра. Еще раз спасибо. – Thierry