Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano, że mogą wystąpić limity czasu klienta lub długie okresy opóźnienia, ponieważ niestandardowe rozszerzenia programu WCF wymuszają sekwencyjne uruchamianie operacji współbieżnych i zapewnia rozwiązanie.
Oryginalna wersja produktu: Microsoft .NET Framework 4.5
Oryginalny numer KB: 2907010
Objawy
Rozważmy następujący scenariusz:
Masz usługę Windows Communication Foundation (WCF) skonfigurowaną do obsługi wielu współbieżnych żądań.
Masz niestandardowe implementacje dowolnych z następujących rozszerzeń WCF:
ServiceAuthenticationManagerServiceAuthorizationManagerIDispatchMessageInspectorIDispatchOperationSelector
Te implementacje są kosztowne obliczeniowo lub czasami powodują długie opóźnienia.
Równoczesne operacje usługi wydają się być uruchamiane sekwencyjnie lub upłynął limit czasu klientów.
Jeśli w tym scenariuszu wystąpiły przekroczenia limitu czasu klienta lub długie czasy odpowiedzi, które wydają się niezwiązane z obciążeniem serwera, możesz użyć tych niestandardowych rozszerzeń WCF w sposób, który wyzwoli ten problem.
Ponadto może wystąpić sytuacja, w której jedno żądanie opóźnia inne żądania. Następnie wiele żądań może zakończyć się nagle, zanim kolejne żądanie ponownie opóźni inne żądania. To zachowanie można wyświetlić przy użyciu licznika ServiceModelService Wywołania na sekundę w monitor wydajności. W przypadku wystąpienia tego zachowania liczba może spaść do zera, podczas gdy kod rozszerzenia jest uruchamiany, nawet w przypadku wielu równoczesnych żądań zaległych. Gdy kod rozszerzenia zwraca kontrolę w usłudze WCF, licznik powraca do swojego typowego poziomu, aż kolejne opóźnienie w kodzie rozszerzenia ponownie spadnie do zera.
Przyczyna
Ten problem występuje, ponieważ program WCF wywołuje te konkretne punkty rozszerzalności synchronicznie na wczesnym etapie potoku obsługi komunikatów. Opóźnienia w tych punktach rozszerzalności mogą blokować ten potok. Zapobiega to równoczesnemu wykonywaniu operacji usługi. Komunikaty odbierane w tym czasie są kolejkowane, ale nie są obsługiwane, dopóki te punkty rozszerzalności nie powrócą kontroli do programu WCF.
Powoduje to, że operacje usługi są uruchamiane pojedynczo, a nie jednocześnie. Każde żądanie czeka w kolejce do poprzedniego, aby zakończyć wykonywanie tych punktów rozszerzalności. Jeśli opóźnienie jest wystarczająco duże, najnowsze żądania mogą upłynął limit czasu podczas oczekiwania na zakończenie wcześniejszych żądań.
Poniżej przedstawiono konkretne metody rozszerzalności, których dotyczy problem:
- Microsoft .NET Framework 4.5 i .NET Framework 4.0:
ServiceAuthenticationManager.Authenticate()
- .NET Framework .NET Framework 4.5, .NET Framework 4.0, .NET Framework 3.5 i .NET Framework 3.0:
ServiceAuthorizationManager.CheckAccessCore()IDispatchMessageFormatter.AfterReceiveRequest()IDispatchOperationSelector.SelectOperation()
Rezolucja
Aby rozwiązać ten problem, skorzystaj z jednej z następujących metod:
- Zminimalizuj opóźnienie tych punktów rozszerzalności.
- Przenieś obciążenie o dużym opóźnieniu w innym miejscu w potoku.
- Użyj innego powiązania WCF.
Istnieją pewne typowe rozwiązania, które mogą prowadzić do dużego opóźnienia z tych punktów rozszerzalności:
- Uzyskiwanie dostępu do bazy danych, szczególnie w innej warstwie
- Wywoływanie innych usług w innej warstwie
- Używanie dużej ilości pamięci lub wątków
- Wykonywanie kosztownej pracy obliczeniowej
Jeśli ta praca o dużym opóźnieniu jest wymagana, należy ją przenieść z tych punktów rozszerzalności. Na przykład jeśli ta praca jest wykonywana wewnątrz samej operacji usługi, pozwoli to jednocześnie uruchomić wiele operacji.
To zachowanie może również zależeć od możliwości powiązania używanego dla punktu końcowego. Na przykład BasicHttpBinding wykazuje to zachowanie, natomiast WsHttpBinding nie.