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

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

icelava
источник
Как мне сопоставить привязку, используя «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

daniele3004
источник
0

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

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
Дерек Дин
источник