2012-12-12 17 views
7

W końcu klient dupleksu Silverlight 4 otrzymywał błędy 404 Not Found dla wiadomości ankiety, natychmiast po wysłaniu ankiety z usługi WCF do klienta Silverlight, czasami zdarza się to w przypadku drugiej ankiety, czasami łączność działa godzinami lub nawet dni, ale najczęściej kończy się niepowodzeniem w pierwszych minutach.Klient Silverlight otrzymujący komunikat Silverlight 404 nie znalazł odpowiedzi na wiadomość z ankietą

! Co ciekawe, problem jest podobny do znanego błędu Silverlight 4 przy korzystaniu z trybu dupleksowego MaxMessagesPerPoll, a rozwiązanie to jest opisane here i here, ale używam trybu SingleMessagePerPoll. ANYway próbowałem używać ClientStack jako sugerowane, ale nic się nie zmieniło.

przepływu ogólne:

  1. SL klient wykonuje metody usługi WCF, otrzymał odpowiedź
  2. Then natychmiast SL klient rozpocząć wysyłanie poll wiadomości do serwisu, a następnie coraz wyjątek dla drugiego lub Ns wiadomości sondzie

    System.Net.WebException: The remote server returned an error: NotFound

  3. Fiddler show only empty 404 odpowiedź na wiadomość ankiety
  4. Następnie klient Chan Impreza nel zarzucić podniesiony

Próbuję podłączyć SL klienta po takiej awarii, pojedynczy strumień reconnect ponawiania:

  1. Uchwyt Faulted wydarzenie
  2. Wypisz wszystkie zdarzenia z kanałem typu Closed/Closing/Opened/Opening
  3. Blisko kanał we właściwy sposób, używając try { close } catch { abort }
  4. Wszystkie poniżej w wątku wątek ankiety: (I foudn to działa nieco stabilnie - see this article)
  5. Odczekaj 45-70 sekund
  6. stosując tę ​​samą DuplexChannelFactory<T> instancji utworzyć nowy kanał, zapisz się do wszystkich zdarzeń kanału tylko dla celów rejestrowania
  7. Execute metody usługi WCF

Po 1-10 powtórzeń (~ 1-10 minut) klient ostatecznie łączy się z serwerem i kontynuuje normalne pobieranie.

W dzienniku serwisowym WCF widzę, że otrzymuje on wszystkie wyraźne żądania, przetwarzane bez żadnego wyjątku, więc wydaje się, że coś dzieje się po stronie klienta Silverlight.

Informacje ogólne:

  • .NET Framework 4.0
  • metody PollingDuplex
  • asynchroniczny WCF
  • IIS 6.0 hostowane usługi WCF
  • Silverligth 4 klient
  • Client System operacyjny: Windows XP SP2
  • Server OS: Windows 2003 R2 SP2
  • Uwierzytelnianie NTLM
  • DuplexMode: SingleMessagePerPoll
  • Istnieje inna usługa WCF, który Czy Request/Reply zanim moja usługa zacznie działać, nie korzysta z połączenia dupleksowego
  • W usłudze klienta SL loguję wszystko do interfejsu użytkownika, więc widzę wszystkie zdarzenia i czas na każde zdarzenie
  • Brak błędów w dziennikach IIS, dzienników zdarzeń serwerów

Klient:

var binaryBinding = new BinaryMessageEncodingBindingElement(); 
binaryBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue; 

var httpbindingElement = new HttpTransportBindingElement 
{ 
    MaxReceivedMessageSize = 131072 
}; 

var pollingDuplexBindingElement = new PollingDuplexBindingElement 
{ 
    ClientPollTimeout = new TimeSpan(0, 0, 1, 30), 
    InactivityTimeout = new TimeSpan(0, 8, 0, 0), 
}; 


_binding = new CustomBinding(
      pollingDuplexBindingElement, 
      binaryBinding, 
      httpbindingElement) 
     { 
      SendTimeout = new TimeSpan(0, 0, 0, 45), 
      CloseTimeout = new TimeSpan(0, 0, 0, 25), 
      ReceiveTimeout = new TimeSpan(0, 8, 0, 0), 
      OpenTimeout = new TimeSpan(0, 0, 0, 45) 
     }; 


httpbindingElement.AuthenticationScheme = AuthenticationSchemes.Negotiate; 
var endpoint = new EndpointAddress(_endpointAddress); 
_channelFactory = new DuplexChannelFactory<TWebService>(
         new InstanceContext(instanceOfClientServiceClass), 
         _binding, 
         endpoint); 


// then this factory used to create a new channels 
// Also for a new channel I'm setting OpTimeout 
var contextChannel = newChannel as IContextChannel; 
if (contextChannel != null) 
{ 
    contextChannel.OperationTimeout = TimeSpan.FromSeconds(45); 
} 

Serwer:

  • WCF, PerSession, wielowątkowy
  • Wszystko jest bezpieczne dla wątków
  • Brak wyjątków usługi serwera podczas wykonywania
  • Wiele rejestrowania więc widzę, co się dzieje w służbie
  • Wszystko WCF Ślady są włączone z switchValue All, nic podejrzanego
<binding name="customName" 
      sendTimeout="00:01:00" 
      receiveTimeout="08:00:00" 
      openTimeout="00:01:00" 
      closeTimeout="00:00:35"> 
    <pollingDuplex 
     inactivityTimeout="08:00:00" 
     serverPollTimeout="00:01:00" /> 
     <binaryMessageEncoding /> 
      <httpTransport authenticationScheme="Ntlm" 
          maxReceivedMessageSize="131072">    
     </httpTransport> 
</binding> 

<behavior name="customBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceThrottling 
      maxConcurrentCalls = "500" 
      maxConcurrentSessions = "500" 
      maxConcurrentInstances = "500" /> 
</behavior> 
+0

Sprawdź http://stackoverflow.com/questions/1521117/wcf-over-ssl-404-error –

+0

Dzięki, ale wydaje mi się, że to nie moja sprawa, nie używam SSL i mysiek, czasami pracuję bez 404 przez kilka dni, ale czasami nie mogę pracować dobrze nawet 10 minut – sll

Odpowiedz

1

Badając problemu opisanego w tej sprawie stackoverflow zakładać Static constructor called twice for PerSession WCF service stwierdziliśmy, że Polling Duplex rozpocząć pracę stabilne kiedy włączony IIS konfigurację bazowego AppPool użyć jednego procesu roboczego zamiast 2 jak został podany wcześniej. Nie jestem pewien, dlaczego wcześniej ustawiono 2, ponieważ nie jestem właścicielem tego serwera, ale w każdym razie to jest to, co mam teraz - wielu klientów Silverlight uruchomionych na tym samym komputerze działa stabilnie i odpytuje ankiety i nie ma błędów 404, wszyscy klienci ponownie łączą się 1 po ponownym uruchomieniu usług IIS i ponownym przetworzeniu ...

Zobacz Performance Application Pool Settings więcej szczegółów

TL; DR: Kiedy IIS gospodarzem WCF rezyduje w AppPool który ma więcej niż jeden proces roboczy - dupleks sondowania staje się niestabilny. Tak więc w przypadku dużego obciążenia IIS rozpoczął drugi proces i zaczął tworzyć instancje usługi WCF również w drugim procesie, więc natknąłem się na sytuacje, gdy sesja klienta została utworzona w jednym procesie, ale wydaje się, że ankieta czasami osiągnęła inny proces, który nie jest świadomy bieżących połączenie/sesja, więc zacznij odrzucać takie wiadomości i cały błąd połączenia.

Tak Polling Duplex z projektem nie jest skalowalna w wielu procesów w ramach jednego serwera IIS i AppPool, innymi słowy, jeśli masz więcej niż 1 proces roboczy - to webGarden środowisko i duplex is not scalable across web farms and gardens

3

Jeśli wszystko wydaje się działać dobrze, to może to to problem z infrastrukturą sieciową/konfiguracją (np konfiguracja dns). Czy pojawia się ten sam problem podczas uruchamiania lokalnie lub używania adresu IP zamiast nazwy hosta?

Podobny problem może również wystąpić, jeśli masz kilka wiązań skonfigurowane na Stronie w IIS (zobacz tutaj szczegóły: http://blogs.msdn.com/b/rampo/archive/2008/02/11/how-can-wcf-support-multiple-iis-binding-specified-per-site.aspx)

Inną rzeczą jest to w jaki sposób przekazywane z serwera do klienta. Jeśli po kolei wykonujesz iterację klientów w pętli i wywołuje metody oddzwaniania, możesz otrzymać limity czasu, które będą wyświetlane jako 404. Oddzwanianie powinno się generalnie wywoływać w wątkach tła (po jednym na klienta).

W zależności od sposobu komunikacji może to być również spowodowane zakleszczeniem (gdy wątek interfejsu użytkownika jest związany z wysyłaniem/odbieraniem komunikatów/wywołań zwrotnych do iz usługi).

+0

Dzięki za link, czytaj teraz. W IIS jedna strona ma ~ 15 VD, a niektóre mają identyczne licytacje od czasu uruchomienia tych samych usług, ale na różnych portach. 1) w odniesieniu do repozytoriów klienta - Używam trybu instancji usługi PerSession, więc pojedyncza usługa na połączenie klienta – sll

+0

I mamy 'multipleSiteBindingsEnabled' ustawiony na true w web.config – sll

+0

Co do wywołań zwrotnych w wątkach w tle, czy na pewno ma to sens dla interfejsu użytkownika? mniej usługi WCF? Zauważyłem też, że w przypadku klienta Silverligth nie można wykonać asynchronicznego wywołania zwrotnego ?! Tak czy inaczej, ręcznie wysyłam wątek UI i nie ma żadnych wyjątków, ponieważ włączam je wszystkie. – sll