Usługa WCF, jak zwiększyć limit czasu?


94

Może wydawać się głupie pytanie, ale wszystko w WCF wydaje się o wiele bardziej skomplikowane niż w asmx, jak mogę zwiększyć limit czasu usługi svc?

Oto, co mam do tej pory:

<bindings>
      <basicHttpBinding>
        <binding name="IncreasedTimeout" 
          openTimeout="12:00:00" 
          receiveTimeout="12:00:00" closeTimeout="12:00:00"
          sendTimeout="12:00:00">
        </binding>
      </basicHttpBinding>
</bindings>

A potem mój punkt końcowy zostanie zmapowany w ten sposób:

<endpoint address="" 
  binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
             contract="ServiceLibrary.IDownloads">
             <identity>
                <dns value="localhost" />
             </identity>
          </endpoint>

Dokładny błąd, który otrzymuję:

Kanał żądania przekroczył limit czasu podczas oczekiwania na odpowiedź po 00: 00: 59.9990000. Zwiększ wartość limitu czasu przekazaną do wywołania Request lub zwiększ wartość SendTimeout w Binding. Czas przeznaczony na tę operację mógł być częścią dłuższego limitu czasu.

W kliencie testowym WCF znajduje się ikona konfiguracji, która zawiera konfigurację w czasie wykonywania mojej usługi:

Jak widzisz, nie są to te same wartości, które dla niego ustawiłem? Co ja robię źle?

<bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>

Odpowiedzi:


179

W konfiguracji powiązania istnieją cztery wartości limitu czasu, które można dostosować:

<bindings>
  <basicHttpBinding>
    <binding name="IncreasedTimeout"
             sendTimeout="00:25:00">
    </binding>
  </basicHttpBinding>

Najważniejszy jest sendTimeout, który mówi, jak długo klient będzie czekał na odpowiedź z usługi WCF. Możesz określić hours:minutes:secondsw swoich ustawieniach - w mojej próbce ustawiłem limit czasu na 25 minut.

Jak openTimeoutsama nazwa wskazuje, to czas, przez jaki chcesz czekać, gdy otworzysz połączenie z usługą WCF. Podobnie closeTimeoutjest to czas, przez jaki będziesz czekać, po zamknięciu połączenia (usunięciu serwera proxy klienta), zanim zostanie zgłoszony wyjątek.

receiveTimeoutJest trochę jak lustro dla osób sendTimeout- podczas timeout wyślij to ilość czasu będziesz czekać na odpowiedź od serwera, receiveTimeoutto ilość czasu będziesz daje klientowi odbierać i przetwarzać odpowiedź z serwer.

W przypadku, gdy wysyłasz „normalne” wiadomości w obie strony, oba mogą być dość krótkie - zwłaszcza receiveTimeout, ponieważ otrzymanie wiadomości SOAP, odszyfrowanie, sprawdzenie i deserializacja nie powinno zająć prawie żadnego czasu. Sytuacja jest inna w przypadku przesyłania strumieniowego - w takim przypadku możesz potrzebować więcej czasu na kliencie, aby faktycznie ukończyć „pobieranie” strumienia otrzymanego z serwera.

Istnieje również openTimeout, acceptTimeout i closeTimeout. Dokumentacja MSDN dotycząca wiązania zawiera więcej informacji o tym, do czego służą.

Aby na poważnie zrozumieć wszystkie zawiłości WCF, zdecydowanie polecam zakup książki „ Learning WCF ” autorstwa Michele Leroux Bustamante:

Nauka WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

a także spędzasz trochę czasu oglądając jej 15-częściowy screencast z serii „ WCF od góry do dołu ” - gorąco polecam!

Aby uzyskać bardziej zaawansowane tematy, zalecamy zapoznanie się z książką Juwal Lowy Programming WCF Services.

Programowanie WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg


Próbowałem dodać sekcje powiązań do <system.serviceModel> w web.config, ale teraz generuje błąd ... wszelkie dodatkowe kroki, których przegapiłem ...
JL.

Zmieniłem również punkt końcowy w mojej usłudze na <endpoint address = "" binding = "IncreasedTimeout" - czy to jest niewłaściwa rzecz?
JL.

Myślę, że to rozumiem - binding = "basicHttpBinding" bindingConfiguration = "IncreasedTimeout"
JL.

dokładnie - powiązanie to typ używanego protokołu - basicHttp, wsHttp, netTcp. Konfiguracja powiązania to ta, którą tworzysz w configu w celu modyfikacji limitów czasu itp.
marc_s

Zabawne, nawet po wykonaniu tej czynności, wciąż otrzymując błąd przekroczenia czasu. Marc, czy możesz podać jak najwięcej informacji?
JL.

27

Najlepszym sposobem jest zmiana dowolnego ustawienia w kodzie.

Sprawdź poniższy przykład:

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}

jest to lepsze rozwiązanie niż aktualizacja konfiguracji, więc mogę skonfigurować inną wartość dla różnych połączeń i usług, wielkie dzięki
Salim

26

Konfiguracja limitu czasu musi być ustawiona na poziomie klienta, więc konfiguracja, którą ustawiłem w pliku web.config, nie przyniosła żadnego efektu, narzędzie testowe WCF ma własną konfigurację i tam należy ustawić limit czasu.


1
no tak - zazwyczaj trzeba to ustawić zarówno na kliencie, jak i na serwerze, nawet - np. w przypadku "inactivityTimeout" na sesjach i tym podobnych.
marc_s

8
JL: czy możesz pokazać, co dokładnie zrobiłeś? mam ten sam problem
Nick Kahn,

Jeśli korzystasz z „klienta testowego WCF”, kliknij prawym przyciskiem myszy „Plik konfiguracyjny” w drzewie usług, a następnie kliknij „Edytuj za pomocą SvcConfigEditor” i zmień limit czasu w ramach powiązań.
Radderz

4

Ostatnio pojawił się ten sam błąd, ale udało mi się go naprawić, zapewniając zamknięcie każdego wywołania klienta WCF. na przykład.

WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();

lub

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}

10
Nie używaj podejścia „używając”: omaralzabir.com/do-not-use-using-in-wcf-client
Alex Marshall,

W komentarzach omaralzabir.com/do-not-use-using-in-wcf-client znajdują się przykłady tego, jak nadal używać using, nie usuwając uszkodzonego obiektu kanału. Oto kolejny bloger z podejściem bardziej kompatybilnym z usingblokami: erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper .
Greg
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.