2016-06-10 14 views
5

Po otrzymaniu żądania HTTP przez IIS przekazuje żądanie do żądanej aplikacji w puli aplikacji obsługiwanej przez jeden lub więcej procesów roboczych. Proces roboczy spowoduje utworzenie wątku ze wspólnej puli wątków (jeśli jest to wymagane) w celu obsługi żądania http.Kontroler Web Api i Pula wątków

(i) Czy w kontekście kontrolera internetowego interfejsu API po otrzymaniu tego żądania kontroler jest inicjowany i przypisywany do utworzonego wątku?

(ii) Jeśli istnieje wiele żądań http do tego samego kontrolera APi, czy będzie tyle wystąpień kontrolera na jeden wątek wątku?

(iii) W scenariuszu, w którym zasób, który nie jest bezpieczny dla wątków (dbContext), jest deklarowany na poziomie klasy i tworzony w konstruktorze, a następnie używany w metodach klasy. Czy wystąpią problemy z zatwierdzaniem transakcji i zarządzaniem nimi?

W istocie, czy istnieje przypadek dopasowania kontrolera jeden do jednego na wątek? (Wiem, że w asp.net wiele wątków może faktycznie obsługiwać jedno żądanie http).

Odpowiedz

3

(i) W ramach sterownika api WWW, gdy żądanie jest otrzymana jest regulator wystąpienia i przypisany do wywoływanych nici? (ii) Gdy istnieje wiele żądań http do tego samego kontrolera api, będzie tyle wystąpień kontrolera na jeden wątek wątku?

Po otrzymaniu żądania instancja kontrolera jest tworzona przez ControllerFactory lub DependencyResolver.

Zasadniczo główny wątek tworzy instancję kontrolera, a następnie to samo wystąpienie jest współużytkowane przez wiele wątków do momentu zakończenia żądania.

(iii) W sytuacji, w której zasób, który nie jest bezpieczny wątku (dbContext) deklarowana jest na poziomie klasy i instancja w konstruktora, a następnie wykorzystywane w metodach klasy. Czy wystąpią problemy związane z dokonywaniem i zarządzaniem transakcjami ?

Tak, element udziału lub statyczny nie są bezpieczne dla wątków. Jednak zmienne lokalne w metodach działania są bezpieczne dla wątków.

+0

Dlatego sensowne jest tworzenie dbcontextu w ramach metod akcji i ponowne użycie ich w wielu instancjach różnych repozytoriów, wszystkie w zakresie metody działania. Próbowałem już tego i działa :). Ale obawiam się, że jakiś kod śmierdzi ... –

1

Odpowiedz na pytania po pkt:
(i). Tak
(ii). Nie. Zwykle sterowniki są pojedynczo i nie są bezpieczne dla wątków. Tworzysz wiele wątków, aby obsłużyć wiele żądań, ale wykonają one kalibrację tej samej instancji (lub usługi) kontrolera (). Tak. Twoim obowiązkiem jest dbać o sprawdzanie poprawności danych lub zwracać uwagę na kwestie bezpieczeństwa. Jeśli nie, możesz zmierzyć się z różnymi problemami, takimi jak brudne czytanie, brudna jazda, bezpieczeństwo nici ... wszystkie rodzaje problemów związanych z bezpieczeństwem nici.

Możesz traktować kontroler jako usługę, więc po prostu przekazuj przychodzące żądania do nowych podsieci lub kontrolerów, tworząc nową instancję, taką jak tworzenie nowej procedury obsługi zadań dla każdego żądania, ALE nadal musisz myśleć o bezpieczeństwie wątków współdzielonych zasobów, takich jak Baza danych .

+0

czy jesteś pewny/a swojej odpowiedzi (ii)? na tej stronie https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection stwierdza: "Kontrolery są tworzone na żądanie." , ale może źle Cię zrozumiałem. – schmendrick

Powiązane problemy