Zwiększenie wartości limitu czasu w usłudze WCF

133

Jak zwiększyć domyślny limit czasu do ponad 1 minuty w usłudze WCF?

Blankman
źródło
Nie jest jasne, ale myślę, że pytasz niejawnie, to czy jest możliwe skonfigurowanie po stronie serwera tak, aby przekroczono limit czasu wszystkich połączeń, których przetworzenie trwa dłużej niż jedną minutę. Nie jest to możliwe
gravidThoughts

Odpowiedzi:

196

Czy masz na myśli stronę serwera czy klienta?

W przypadku klienta chciałbyś dostosować atrybut sendTimeout elementu powiązania. W przypadku usługi chciałbyś dostosować atrybut acceptTimeout elementu powiązania.

<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>
....

Oczywiście musisz zmapować żądany punkt końcowy do tego konkretnego powiązania.

icelava
źródło
Jak zamapować powiązanie, używając „bindingname” wewnątrz tagu punktu końcowego?
Blankman
Jest to po prostu błędne. Po receiveTimeoutstronie serwera zarządza określaniem bezczynności dla powiązań opartych na sesji. Na przykład serwer nie będzie używać tego ustawienia do podstawowych powiązań HTTP. Musisz ustawić własne limity czasu przetwarzania po stronie serwera dla WCF
gravidThoughts
45

W menu Narzędzia w programie Visual Studio 2008 (lub 2005, jeśli masz zainstalowane odpowiednie rzeczy WCF) znajduje się opcja o nazwie „Edytor konfiguracji usługi WCF”.

Stamtąd możesz zmienić opcje wiązania zarówno dla klienta, jak i usług, jedna z tych opcji będzie dotyczyła limitów czasu.

Kieron
źródło
To narzędzie to świetny sposób na uniknięcie błędów, takich jak nieprawidłowe zawijanie elementów, pisownia itp. Dobra rozmowa!
markaaronky
zobacz także tutaj inne narzędzie do otwierania plików dziennika: stackoverflow.com/a/34283667/187650
juFo
8

Możesz wybrać dwa sposoby:

1) Kodem w kliencie

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) Za pomocą konsoli WebConfig na serwerze WWW

<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>

Aby uzyskać więcej informacji, zapoznaj się z oficjalną dokumentacją

Konfigurowanie wartości limitu czasu w powiązaniu

Klasa WSHttpBinding

daniele3004
źródło
0

Oprócz limitów czasu wiązania (które są w Timespans), możesz również tego potrzebować. To zajmie kilka sekund.

<system.web>
    <httpRuntime executionTimeout="600"/><!-- = 10 minutes -->
Derreck Dean
źródło