Увеличение значения времени ожидания в службе WCF


133

Как увеличить время ожидания по умолчанию до более 1 минуты в службе WCF?


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

Ответы:


196

Вы имеете в виду сторону сервера или сторону клиента?

Для клиента вы бы хотели настроить атрибут sendTimeout элемента привязки. Для услуги, вы хотите настроить ReceiveTimeout атрибут связывания elemnent.

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="longTimeoutBinding"
        receiveTimeout="00:10:00" sendTimeout="00:10:00">
        <security mode="None"/>
      </binding>
    </netTcpBinding>
  </bindings>

  <services>
    <service name="longTimeoutService"
      behaviorConfiguration="longTimeoutBehavior">
      <endpoint address="net.tcp://localhost/longtimeout/"
        binding="netTcpBinding" bindingConfiguration="longTimeoutBinding" />
    </service>
....

Конечно, вы должны сопоставить желаемую конечную точку с этой конкретной привязкой.


Как мне сопоставить привязку, используя «bindingname» внутри тега конечной точки?
Blankman

Это просто неправильно. На receiveTimeoutстороне сервера определяет определение простоя для привязок на основе сеанса. Например, сервер не будет использовать этот параметр для базовых привязок HTTTP. Вы должны свернуть свои собственные тайм-ауты обработки на стороне сервера для WCF
gravidThoughts

45

В меню «Инструменты» в Visual Studio 2008 (или 2005, если у вас установлены правильные компоненты WCF) есть параметры «Редактор конфигурации службы WCF».

Оттуда вы можете изменить параметры привязки как для клиента, так и для служб, один из этих вариантов будет для тайм-аутов.


Этот инструмент - отличный способ избежать ошибок, таких как неправильная упаковка элементов, орфография и т. Д. Хороший вызов!
markaaronky

см. также здесь другой инструмент для открытия файлов журнала: stackoverflow.com/a/34283667/187650
1818 года


8

Вы можете выбрать два способа:

1) по коду в клиенте

public static void Main()
{
    Uri baseAddress = new Uri("http://localhost/MyServer/MyService");

    try
    {
        ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService));

        WSHttpBinding binding = new WSHttpBinding();
        binding.OpenTimeout = new TimeSpan(0, 10, 0);
        binding.CloseTimeout = new TimeSpan(0, 10, 0);
        binding.SendTimeout = new TimeSpan(0, 10, 0);
        binding.ReceiveTimeout = new TimeSpan(0, 10, 0);

        serviceHost.AddServiceEndpoint("ICalculator", binding, baseAddress);
        serviceHost.Open();

        // The service can now be accessed.
        Console.WriteLine("The service is ready.");
        Console.WriteLine("Press <ENTER> to terminate service.");
        Console.WriteLine();
        Console.ReadLine();

    }
    catch (CommunicationException ex)
    {
        // Handle exception ...
    }
}

2) По WebConfig в веб-сервере

<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding openTimeout="00:10:00" 
                 closeTimeout="00:10:00" 
                 sendTimeout="00:10:00" 
                 receiveTimeout="00:10:00">
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

Для более детального ознакомления с официальной документацией

Настройка значений времени ожидания для привязки

Класс WSHttpBinding


0

В дополнение к обязательным таймаутам (которые указаны в Timespanс), вам также может понадобиться это. Это в секундах.

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.