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:
- SL klient wykonuje metody usługi WCF, otrzymał odpowiedź
- 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
- Fiddler show only empty
404
odpowiedź na wiadomość ankiety - Następnie klient Chan Impreza nel zarzucić podniesiony
Próbuję podłączyć SL klienta po takiej awarii, pojedynczy strumień reconnect ponawiania:
- Uchwyt
Faulted
wydarzenie - Wypisz wszystkie zdarzenia z kanałem typu
Closed/Closing/Opened/Opening
- Blisko kanał we właściwy sposób, używając
try { close } catch { abort }
- Wszystkie poniżej w wątku wątek ankiety: (I foudn to działa nieco stabilnie - see this article)
- Odczekaj 45-70 sekund
- stosując tę samą
DuplexChannelFactory<T>
instancji utworzyć nowy kanał, zapisz się do wszystkich zdarzeń kanału tylko dla celów rejestrowania - 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>
Sprawdź http://stackoverflow.com/questions/1521117/wcf-over-ssl-404-error –
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