Szczegółowe dochodzenie dotyczące wyjątku limitu czasu WCF

Mamy aplikację, która ma usługę WCF (*.svc) działa na IIS7 i różnych klientów pytających o usługę. Na serwerze działa serwer Win 2008. Klienci korzystają z systemu Windows 2008 Server lub Windows 2003 server. Otrzymuję następujący wyjątek, który widziałem w rzeczywistości może być związany z dużą liczbą potencjalnych problemów WCF.

System.TimeoutException: The request channel timed out while waiting for a reply after 00:00:59.9320000. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout. ---> System.TimeoutException: The HTTP request to 'http://www.domain.com/WebServices/myservice.svc/gzip' has exceeded the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout. 

Zwiększyłem limit czasu do 30min i błąd nadal wystąpił. To mi mówi, że w grę wchodzi coś innego, ponieważ ilość danych nigdy nie może zająć 30 minut, aby przesłać lub pobrać.

Błąd przychodzi i odchodzi. W tej chwili jest to częstsze. Nie wydaje się mieć znaczenia, czy mam 3 klientów działających jednocześnie, czy 100, nadal występuje raz na jakiś czas. Przez większość czasu nie ma przerw czasowych, ale nadal dostaję kilka na godzinę. Błąd pochodzi z jednej z wywoływanych metod. Jedna z tych metod nie posiada parametrów i zwraca bit danych. Inny pobiera wiele danych jako parametr, ale wykonuje się asynchronicznie. Błędy zawsze pochodzą od klienta i nigdy nie odwołują się do żadnego kodu na serwerze w śledzeniu stosu. Zawsze kończy się na:
 at System.Net.HttpWebRequest.GetResponse()
  at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)

Na serwerze: Wypróbowałem (i obecnie mam) następujące ustawienia wiązania:

maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"

To nie wydaje się mieć wpływu.

Próbowałem (i obecnie mam) następujące ustawienia dławienia:

<serviceThrottling maxConcurrentCalls="1500"   maxConcurrentInstances="1500"    maxConcurrentSessions="1500"/>

To nie wydaje się mieć wpływu.

Obecnie mam następujące ustawienia dla usługi WCF.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]

Pobiegłem z ConcurrencyMode.Multiple przez chwilę, a błąd nadal wystąpił.

Próbowałem zrestartować usługi IIS, zrestartować podstawowy serwer SQL, zrestartować maszynę. Wszystko to nie wydaje się mieć wpływu.

Próbowałem wyłączyć Zaporę systemu Windows. To nie wydaje się mieć wpływu.

Na kliencie Mam takie ustawienia:

maxReceivedMessageSize="2147483647"

<system.net>
    <connectionManagement>
    <add address="*" maxconnection="16"/>
</connectionManagement> 
</system.net>

Mój klient zamyka swoje połączenia:

var client = new MyClient();

try
{
    return client.GetConfigurationOptions();
}
finally
{
    client.Close();
}

Mam zmieniono ustawienia rejestru, aby umożliwić więcej połączeń wychodzących:

MaxConnectionsPerServer=24, MaxConnectionsPer1_0Server=32.

Niedawno wypróbowałem SvcTraceViewer.exe. Udało mi się złapać jeden wyjątek po stronie klienta. Widzę, że jego czas trwania wynosi 1 minutę. Patrząc na ślad po stronie serwera, widzę, że serwer nie jest świadomy tego wyjątku. Maksymalny czas jaki widzę to 10 sekund.

Przyjrzałem się aktywnym połączeniom bazy danych za pomocą exec sp_who na serwerze. Mam tylko kilka (2-3). Patrzyłem na TCP połączenia z jednego klienta przy użyciu TCPview. Zwykle jest około 2-3 I widziałem do 5 lub 6.

Mówiąc najprościej, jestem zakłopotany. Próbowałem wszystkiego, co mogłem znaleźć, i musi mi brakować czegoś bardzo prostego, co ekspert WCF byłby w stanie zobaczyć. Mam przeczucie, że coś blokuje moich klientów na niskim poziomie (TCP), zanim serwer faktycznie otrzyma wiadomość i/lub że coś ustawia wiadomości w kolejce na poziomie serwera i nigdy nie pozwala im przetworzyć.

Jeśli masz jakieś liczniki wydajności, na które powinienem spojrzeć, daj mi znać. (proszę wskazać, jakie wartości są złe, ponieważ niektóre z tych liczników są trudne do rozszyfrowania). Jak mogę zarejestrować rozmiar wiadomości WCF? Wreszcie, czy są jakieś narzędzia, które pozwoliłyby mi przetestować, ile połączeń mogę nawiązać między moim klientem a serwerem (niezależnie od mojej aplikacji)

Dziękujemy za poświęcony czas!

Dodatkowe informacje dodane 20 czerwca:

Mój WCF aplikacja robi coś podobnego do poniższych.

while (true)
{
   Step1GetConfigurationSettingsFromServerViaWCF(); // can change between calls
   Step2GetWorkUnitFromServerViaWCF();
   DoWorkLocally(); // takes 5-15minutes. 
   Step3SendBackResultsToServerViaWCF();
}

Używając WireShark, zauważyłem, że gdy wystąpi błąd, mam pięć retransmisji TCP, a następnie reset TCP później. Domyślam się, że RST pochodzi z WCF zabijając połączenie. Raport WYJĄTKÓW, który otrzymuję, pochodzi ze Step3 timing out.

Odkryłem to patrząc na strumień tcp " tcp.stream eq 192" Następnie rozszerzyłem mój filtr do "tcp.stream eq 192 oraz http i http.Prośba.metoda eq POST " i piła 6 Postów podczas tego strumienia. To wydawało się dziwne, więc sprawdziłem z innym strumieniem, takim jak tcp.stream eq 100. Miałem trzy posty, co wydaje się trochę bardziej normalne, ponieważ robię trzy połączenia. Jednak zamykam połączenie po każdym wywołaniu WCF, więc spodziewałbym się jednego wywołania na strumień (ale niewiele wiem o TCP).

Badając nieco więcej, wrzuciłem ładunek pakietów http na dysk, aby zobaczyć, co te sześć połączeń gdzie.

1) Step3
2) Step1
3) Step2
4) Step3 - corrupted
5) Step1
6) Step2

Zgaduję, że dwóch równoległych klientów to używając tego samego połączenia, dlatego widziałem duplikaty. Jednak mam jeszcze kilka problemów, których nie mogę pojąć:

A) dlaczego Pakiet jest uszkodzony? Przypadkowy Fuks sieciowy-może? Obciążenie jest gzipped za pomocą tego przykładowego kodu: http://msdn.microsoft.com/en-us/library/ms751458.aspx - czy kod może być błędny raz na jakiś czas, gdy jest używany jednocześnie? Powinienem testować bez biblioteki gzip.

B) Dlaczego miałbym widzieć Krok 1 i krok 2 działający po uszkodzonym czas operacji? Wydaje mi się, że te operacje nie powinny mieć miejsca. Może nie patrzę na właściwy strumień, ponieważ moje zrozumienie TCP jest wadliwe. Mam inne strumienie, które występują w tym samym czasie. Powinienem zbadać inne strumienie - szybki rzut oka na strumienie 190-194 pokazuje, że Post Step3 ma odpowiednie dane ładunku (nie uszkodzone). Zmuszając mnie, bym znów spojrzał na bibliotekę gzip.

Author: Kent Boogaart, 2009-06-11

12 answers

Jeśli używasz klienta. Net, możesz nie mieć ustawionego

//This says how many outgoing connection you can make to a single endpoint. Default Value is 2
System.Net.ServicePointManager.DefaultConnectionLimit = 200;

Oto oryginalne pytanie i odpowiedź usługa WCF Dławienie

Update :

Ten config wchodzi w. Net aplikacji klienckiej może być przy starcie lub kiedykolwiek, ale przed rozpoczęciem testów.

Ponadto można go mieć w aplikacji.plik konfiguracyjny jak również następujący

<system.net>
    <connectionManagement>
      <add maxconnection = "200" address ="*" />
    </connectionManagement>
  </system.net>
 47
Author: Mubashar Ahmad,
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-05-23 12:17:21

Jeśli jeszcze tego nie próbowałeś - Zamknij operacje WCF po stronie serwera w blokach try / finally i dodaj rejestr, aby upewnić się, że faktycznie powracają.

Jeśli te pokażą, że operacje są zakończone, to moim następnym krokiem będzie przejście na niższy poziom i przyjrzenie się rzeczywistej warstwie transportowej.

Wireshark lub inne podobne narzędzie do przechwytywania pakietów może być bardzo pomocne w tym momencie. Zakładam, że to działa przez HTTP na standardowym porcie 80.

Run Wireshark na kliencie. W opcjach po uruchomieniu przechwytywania ustaw filtr przechwytywania na tcp http and host service.example.com - zmniejszy to ilość nieistotnego ruchu.

Jeśli możesz, zmodyfikuj swojego klienta, aby powiadomił Cię o dokładnym czasie rozpoczęcia połączenia i czasie, w którym wystąpił limit czasu. Albo po prostu uważnie go monitoruj.

Gdy pojawi się błąd, możesz przeszukać dzienniki Wireshark, aby znaleźć początek połączenia. Kliknij prawym przyciskiem myszy na pierwszym pakiecie, który wywołuje klienta (Powinno być coś w stylu GET / service.svc lub POST / service.svc) i wybierz Follow TCP Stream.

Wireshark zdekoduje całą rozmowę HTTP, więc możesz mieć pewność, że WCF faktycznie odsyła odpowiedzi.

 3
Author: ,
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-06-17 17:05:47

From: http://www.codeproject.com/KB/WCF/WCF_Operation_Timeout_.aspx

Aby uniknąć tego błędu timeout, musimy aby skonfigurować OperationTimeout właściwość dla pełnomocnika w kliencie WCF kod. Ta konfiguracja jest czymś nowe w przeciwieństwie do innych konfiguracji takich jako Send Timeout, Receive Timeout itp., które omówiłem na początku w artykuł. Aby ustawić limit czasu tej operacji konfiguracja nieruchomości, musimy wyślij naszego Pełnomocnika do IContextChannel w Aplikacja kliencka WCF przed wywołaniem metody umowy operacyjnej.

 2
Author: Joel Martinez,
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-06-11 15:22:05

Mam bardzo podobny problem. W przeszłości było to związane z problemami serializacji. Jeśli nadal masz ten problem, czy możesz sprawdzić, czy możesz poprawnie serializować zwracane obiekty. W szczególności, jeśli używasz obiektów Linq-to-Sql, które mają relacje, znane są problemy z serializacją, jeśli umieścisz back reference na obiekcie podrzędnym do obiektu nadrzędnego i oznaczysz to back reference jako DataMember.

Możesz zweryfikować serializację przez pisanie aplikacji konsolowej, która serializuje i deserializuje obiekty za pomocą DataContractSerializer po stronie serwera i dowolnych metod serializacji używanych przez Klienta. Na przykład w naszej obecnej aplikacji mamy zarówno klientów WPF, jak i Compact Framework. Napisałem aplikację konsolową, aby sprawdzić, czy mogę serializować za pomocą DataContractSerializer i deserializować za pomocą XmlDesserializer. Możesz spróbować.

Również, jeśli zwracasz Obiekty Linq-to-Sql, które mają Kolekcje potomne, możesz spróbować upewnić się, że niecierpliwie załadowałeś je po stronie serwera. Czasami, z powodu leniwego ładowania, zwracane obiekty nie są wypełniane i mogą powodować zachowanie, które widzisz, gdy żądanie jest wysyłane do metody usługi wiele razy.

Jeśli rozwiązałeś ten problem, chciałbym usłyszeć jak, Bo ja też z nim utknąłem. Zweryfikowałem, że moim problemem nie jest serializacja, więc jestem zagubiony.

UPDATE: nie jestem pewien, czy to ci pomoże, ale Narzędzie Service Trace Viewer właśnie rozwiązało mój problem po 5 dniach bardzo podobnego doświadczenia do twojego. Konfigurując śledzenie, a następnie patrząc na raw XML, znalazłem wyjątki, które powodowały moje problemy z serializacją. Był on związany z obiektami Linq-to-SQL, które czasami miały więcej obiektów potomnych, niż można było z powodzeniem serializować. Dodawanie następujących do swojej sieci.plik konfiguracyjny powinien umożliwić śledzenie:

<sharedListeners>
    <add name="sharedListener"
         type="System.Diagnostics.XmlWriterTraceListener"
         initializeData="c:\Temp\servicetrace.svclog" />
  </sharedListeners>
  <sources>
    <source name="System.ServiceModel" switchValue="Verbose, ActivityTracing" >
      <listeners>
        <add name="sharedListener" />
      </listeners>
    </source>
    <source name="System.ServiceModel.MessageLogging" switchValue="Verbose">
      <listeners>
        <add name="sharedListener" />
      </listeners>
    </source>
  </sources>

Wynikowy plik można otworzyć za pomocą narzędzia Service Trace Viewer lub po prostu w IE, aby zbadać wyniki.

 2
Author: Brett Bim,
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-08-21 21:20:30

Czy zamykasz połączenie z usługą WCF pomiędzy żądaniami? Jeśli tego nie zrobisz, zobaczysz ten dokładny limit czasu (w końcu).

 2
Author: aridlehoover,
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
2011-04-04 22:54:13

Właśnie rozwiązałem problem.Znalazłem, że węzły w aplikacji.plik konfiguracyjny został źle skonfigurowany.

<client>
<endpoint name="WCF_QtrwiseSalesService" binding="wsHttpBinding" bindingConfiguration="ws" address="http://cntgbs1131:9005/MyService/TGE.ISupplierClientManager" contract="*">
</endpoint>
</client>

<bindings>
    <wsHttpBinding>
        <binding name="ws" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text">
            <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
            <**security mode="None">**
                <transport clientCredentialType="None"></transport>
            </security>
        </binding>
    </wsHttpBinding>
</bindings>

Potwierdź konfigurację w węźle <security>, wartość atrybutu "mode" to "None". Jeśli twoja wartość to "Transport", wystąpi błąd.

 2
Author: alexanderlc,
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
2011-11-18 07:35:26
 1
Author: Rakoun,
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
2013-11-12 09:49:55

Czy próbowałeś użyć clientVia aby zobaczyć wysłaną wiadomość, używając SOAP toolkit czy coś w tym stylu? Może to pomóc sprawdzić, czy błąd pochodzi od samego klienta lub z innego miejsca.

 0
Author: Philippe,
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-06-15 12:27:48

Sprawdziłeś ślady WCF? WCF ma tendencję do połykania wyjątków i zwracania tylko ostatniego wyjątku, czyli limitu czasu, który otrzymujesz, ponieważ punkt końcowy nie zwrócił niczego znaczącego.

 0
Author: Miki Watts,
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-06-16 08:31:50

Zostanie również wyświetlony ten błąd, jeśli przekazujesz obiekt z powrotem do klienta, który zawiera właściwość typu enum, która nie jest domyślnie ustawiona i że enum nie ma wartości, która jest mapowana na 0. i. E enum MyEnum{ a=1, b=2};

 0
Author: tim,
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-11-28 18:06:34

Wygląda na to, że ten wyjątek jest dość ogólny i może być odebrany z różnych powodów. Napotkaliśmy to podczas wdrażania klienta na komputerach z systemem Windows 8.1. Nasz klient WCF działa wewnątrz usługi windows i stale bada usługę WCF. Usługa windows działa pod kontrolą Użytkownika Nie-administratora. Problem został rozwiązany przez ustawienie clientCredentialType na "Windows" w konfiguracji WCF, aby umożliwić uwierzytelnianie, jak w poniższym:

      <security mode="None">
        <transport clientCredentialType="Windows" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
 0
Author: Alexander Liberson,
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
2014-06-13 15:57:24

Nie jestem ekspertem WCF, ale zastanawiam się, czy nie napotkasz ochrony DDOS na IIS. Wiem z doświadczenia, że jeśli uruchomisz kilka jednoczesnych połączeń z jednego klienta do serwera w pewnym momencie serwer przestaje odpowiadać na połączenia, ponieważ podejrzewa atak DDOS. Będzie również utrzymywać połączenia otwarte do czasu ich wygaśnięcia, aby spowolnić klienta w jego atakach.

Wiele połączeń pochodzących z różnych maszyn / IP nie powinno być problemem jednak.

Jest więcej informacji w tym poście MSDN:

Http://msdn.microsoft.com/en-us/library/bb463275.aspx

Zobacz sproperty MaxConcurrentSession.

 0
Author: n3wjack,
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-05-13 14:00:53