Wdrażam moją pierwszą usługę REST w .NET 4 i napotkałem coś nieoczekiwanego. Wydaje się, że nie rozumiem podkreślenia działania ServiceModel firmy Microsoft, ale nie mogłem znaleźć odpowiedzi w tradycyjny sposób.Zastosowanie puli wątków w implementacji usługi .NET REST
Aby wdrożyć moją usługę internetową ja po schodach w tym tutorialu: http://blogs.msdn.com/b/endpoint/archive/2010/01/06/introducing-wcf-webhttp-services-in-net-4.aspx
Usługa działa. Zaskoczyło mnie to, że Application_BeginRequest i Application_EndRequest w Global.asax są wywoływane przez różne wątki. Patrząc na ślad stosu, wydaje się, że te wątki są oparte na jakiejś puli wątków.
Bez przeprowadzania refaktoryzacji jest to dla nas problem, ponieważ zawsze zakładaliśmy, że pojedyncze żądanie będzie zawsze uruchamiane w tym samym wątku, dzięki czemu zachowaliśmy niektóre zmienne przechowywane w lokalnej pamięci wątku. Zmienne są inicjowane w Application_BeginRequest i wydawane w Application_EndRequest. Wygląda na to, że z ServiceModel nie jest to właściwe podejście.
Moje pytania są następujące:
- mogę dokonywać żadnych założeń, o których wątki są uruchomione mojego kodu gdy używam ServiceModel?
- Czy istnieje sposób ograniczenia wykonywania do pojedynczego wątku? Czy byłoby to z jakiegoś powodu złe?
- Jaki jest właściwy sposób przechowywania zmiennej przez czas trwania żądania przy korzystaniu z ServiceModel?
Dziękuję.
Aktualizacja do pierwszego pytania. Jest to jeden wątek wywołujący Application_BeginRequest i inny wątek uruchamiający kod usługi i wykonujący Application_EndRequest. Zmiana parametrów usługi ServiceBehavior nic nie dała. Każda pomoc byłaby bardzo cenna. – Alex
Wygląda na to, że używasz kompatybilności asp.net lub próbujesz. Czy próbowałeś zaimplementować swoje rzeczy jako dyspozytorów komunikatów, czy jakikolwiek inny punkt rozszerzenia wcf (zamiast korzystania z asp.net)? – sisve
@Simon Svensson Podążałem za tutorialem Microsoft http://blogs.msdn.com/b/endpoint/archive/2010/01/06/introducing-wcf-webhttp-services-in-net-4.aspx. Które wydaje się używać kompatybilności asp.net. Co by było inaczej, gdyby zastosowano inne podejście? Czy jest dobre miejsce, w którym mógłbym to przeczytać? Dzięki! – Alex