многократные вызовы метода службы WCF в цикле (с использованием одного и того же прокси-объекта), вызывающие тайм-аут - PullRequest
1 голос
/ 07 января 2011

Я вызываю метод службы WCF несколько раз в цикле (с разными параметрами на каждой итерации), и это вызывает тайм-аут после примерно 40 минут.Я использую один и тот же прокси-объект и закрываю его только после завершения цикла.как я могу избежать этой ошибки тайм-аута?мне нужно создать новый прокси для каждого вызова.(на самом деле я вызываю здесь веб-службу сервера отчетов SQL-сервера и передаю разные параметры для создания разных отчетов, и я не использую новый прокси-сервер для каждой итерации, полагая, что это может замедлить генерацию отчетов).Здесь клиент также является службой WCF и размещается в службе Windows.

(это просто пример для иллюстрации, а не фактический код, который не работает)

using(var proxy=new serviceclient())
{
   for(var i=0;i<50;i++)
   {
        proxy.methodName(i);
   }
}

Сообщение об ошибке выглядит примерно так:

System.TimeoutException: истекло время ожидания канала запроса в ожидании ответа после 00:01:00.Увеличьте значение тайм-аута, передаваемое вызову Request, или увеличьте значение SendTimeout в Binding.Время, отведенное для этой операции, могло быть частью более длительного времени ожидания.---> System.TimeoutException: HTTP-запрос к 'http://localhost/ReportServer/ReportExecution2005.asmx' превысил установленное время ожидания 00:01:00.Время, отведенное для этой операции, могло быть частью более длительного времени ожидания.---> System.Net.WebException: истекло время ожидания операции

здесь - клиентская конфигурация WCF (только часть, связанная со службами отчетов, а не вся конфигурация WCF)

<bindings>
  <basicHttpBinding>
    <binding name="ReportExecutionServiceSoap" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
        maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Ntlm" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost/ReportServer/ReportExecution2005.asmx"
    binding="basicHttpBinding" bindingConfiguration="ReportExecutionServiceSoap"
    contract="ReportExecutionServiceReference.ReportExecutionServiceSoap"
    name="ReportExecutionServiceSoap" />
</client>

Ответы [ 4 ]

2 голосов
/ 13 января 2011

эта проблема решена сейчас.Один из отчетов (сгенерированный путем выполнения вызова веб-службы ASMX сервера отчетов) занимал больше времени, чем обычно, и вызывал тайм-аут, это НЕ было связано с количеством вызовов в цикле (каждый вызов веб-службы является синхронным и не помещается в очередь),Чтобы решить эту проблему, я использовал стандартный API веб-службы ASP.NET вместо WCF, чтобы вызвать веб-службу выполнения отчетов и установить время ожидания равным бесконечности, например:

    var webServiceProxy = new ReportExecutionServiceReference.ReportExecutionService()
                              {
                                  Url = ConfigurationManager.AppSettings["ReportExecutionServiceUrl"],
                                  Credentials = System.Net.CredentialCache.DefaultCredentials
                              };
    webServiceProxy.Timeout = Timeout.Infinite;

время ожидания могло быть установлено на большее значениебесконечного, а также.этот веб-сервис вызывается в цикле для каждого отчета, и генерация всех выбранных пользователем отчетов за один раз занимает около двух часов.клиент является службой WCF и размещается в службе Windows вместо IIS, чтобы избежать тайм-аута на клиенте.спасибо за все ответы.

1 голос
/ 07 января 2011

Это просто означает, что ваш сервер не может справиться с нагрузкой или занимает слишком много времени по какой-либо другой причине.Спросите сервер, почему это занимает слишком много времени;не удивляйтесь, когда время ожидания клиента истечет.

0 голосов
/ 09 ноября 2011
Dim ws As WCFService.ServiceClient = New WCFService.ServiceClient
ws.Endpoint.Binding.SendTimeout() = TimeSpan.FromSeconds(2)
0 голосов
/ 07 января 2011

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

Допустим, вы просматриваете список из 10 элементов, каждый ответ обрабатывается на сервере в течение 10 секунд. Поскольку вы используете один и тот же прокси-сервер, все вызовы будут достаточно быстро отправляться из клиентского кода. Но для возврата всех ответов потребуется около 100 секунд (обратите внимание, что я не принимаю во внимание, что у вас задержка в сети, сериализация объектов и т. Д. И т. Д.) Это означает, что все звонки после номера 6 истечут.

Если бы на сервере было больше доступных потоков для обработки данных, этого можно было бы избежать, но проблема могла появиться где-то еще. Вы должны быть в состоянии повторить тот же вызов еще раз, так как тайм-аут может возникнуть и по любой другой причине, из-за проблем с сетью, из-за временной перегрузки сервера и т. Д. И т. Д.

Я бы посоветовал создать какую-то систему запросов, которая отправляет все вызовы сервера, чтобы вы могли сделать тот же вызов снова. Как это будет реализовано, зависит от вашего сценария: Они должны быть отправлены в определенном порядке? Вам нужно знать, когда последний звонок вернулся? и т.д.

...