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

Może wydawać się głupie pytanie, ale wszystko w WCF wydaje się dużo bardziej skomplikowane niż w asmx, Jak mogę zwiększyć timeout 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 jest mapowany tak:

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

Dokładny błąd jaki otrzymuję:

Kanał żądań został przerwany podczas oczekiwania na odpowiedź po 00:00:59.9990000. Zwiększ wartość timeout przekazaną do wywołania żądania lub zwiększ wartość SendTimeout na Wiązanie. 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ę czasu uruchomienia mojej Usługi:

Jak widzisz, to nie te same wartości, które dla niego ustawiłem? Co 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>
 79
wcf
Author: JL., 2009-10-05

4 answers

W konfiguracji wiązania są cztery wartości timeoutu, które możesz 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:seconds w swoich ustawieniach - w mojej próbce ustawiam timeout na 25 minut.

openTimeout Jak sama nazwa wskazuje, jest to czas, który chcesz poczekać, gdy otworzysz połączenie z usługą WCF. Podobnie, closeTimeout to czas, w którym zamykasz połączenie (pozbądź się klienta proxy), na które będziesz czekać przed wyrzuceniem wyjątku.

receiveTimeout jest trochę jak lustro dla sendTimeout - podczas gdy limit czasu wysyłania to czas oczekiwania na odpowiedź od serwera, receiveTimeout to czas, jaki dasz klientowi na otrzymanie i przetworzenie odpowiedzi od serwera.

Jeśli wysyłasz tam i z powrotem "normalne" wiadomości, obie mogą być dość krótkie - szczególnie receiveTimeout, ponieważ otrzymanie wiadomości SOAP, odszyfrowywanie, sprawdzanie i deserializacja nie powinno zająć prawie żadnego czasu. Historia jest inna w przypadku streamingu - w takim przypadku możesz potrzebować więcej czasu na klienta, aby faktycznie zakończyć" pobieranie " strumienia otrzymanego z serwera.

Istnieje również openTimeout, receiveTimeout i closeTimeout. W MSDN docs on binding znajdziesz więcej informacji na temat tego, do czego służą.

Aby na poważnie opanować wszystkie zawiłości WCF, zdecydowanie polecam Kup książkę" Nauka 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ęściową serię screencastów" WCF od góry do dołu " - Gorąco polecam!

Dla bardziej zaawansowanych tematów polecam zajrzeć do serwisów Juwala Lowy ' ego Programowanie WCF książka.

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

 162
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 15:20:52

Konfiguracja timeout musi być ustawiona na poziomie klienta, więc konfigurację, którą ustawiałem w sieci.konfiguracja nie miała żadnego wpływu, narzędzie testowe WCF ma własną konfigurację i tam trzeba ustawić timeout.

 23
Author: JL.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-05 15:42:37

Najlepszym sposobem jest zmiana dowolnych ustawień w kodzie.

Zobacz poniższy przykład:

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}
 15
Author: user3891644,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-21 07:27:25

Ostatnio pojawił się ten sam błąd, ale był w stanie go naprawić, zapewniając zamknięcie każdego połączenia klienta wcf. np.

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

Lub

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}
 4
Author: arjaye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-03 10:09:39