Usługi i ASP.NET WCF
W tym temacie omówiono hostowanie usług Windows Communication Foundation (WCF) obok ASP.NET i hostowanie ich w trybie zgodności ASP.NET.
Hosting programu WCF obok ASP.NET
Usługi WCF hostowane w usługach Internet Information Services (IIS) mogą znajdować się za pomocą programu . Strony ASPX i usługi sieci Web ASMX w jednej wspólnej domenie aplikacji. ASP.NET udostępnia typowe usługi infrastruktury, takie jak zarządzanie domeną aplikacji i dynamiczna kompilacja zarówno dla platformy WCF, jak i środowiska uruchomieniowego HTTP ASP.NET. Domyślna konfiguracja programu WCF jest równoległa z ASP.NET.
Środowisko uruchomieniowe HTTP ASP.NET obsługuje żądania ASP.NET, ale nie uczestniczy w przetwarzaniu żądań przeznaczonych dla usług WCF, mimo że te usługi są hostowane w tej samej domenie aplikacji, co zawartość ASP.NET. Zamiast tego model usługi WCF przechwytuje komunikaty adresowane do usług WCF i kieruje je za pośrednictwem stosu transportu/kanału WCF.
Wyniki modelu równoległego są następujące:
ASP.NET i usługi WCF mogą udostępniać stan AppDomain. Ponieważ obie struktury mogą współistnieć w tym samym elemencie AppDomain, program WCF może również udostępniać stan AppDomain ASP.NET (w tym zmienne statyczne, zdarzenia itd.).
Usługi WCF zachowują się spójnie, niezależnie od środowiska hostingu i transportu. Środowisko uruchomieniowe HTTP ASP.NET jest celowo powiązane ze środowiskiem hostingu IIS/ASP.NET i komunikacją HTTP. Z drugiej strony program WCF jest zaprojektowany tak, aby zachowywał się spójnie w środowiskach hostingu (WCF zachowuje się spójnie zarówno wewnątrz, jak i poza usługami IIS) oraz w transporcie (usługa hostowana w usługach IIS 7.0 i nowszych ma spójne zachowanie we wszystkich uwidacznianych punktach końcowych, nawet jeśli niektóre z tych punktów końcowych używają protokołów innych niż HTTP).
W aplikacji AppDomain funkcje implementowane przez środowisko uruchomieniowe HTTP mają zastosowanie do ASP.NET zawartości, ale nie do usługi WCF. Wiele funkcji specyficznych dla protokołu HTTP platformy aplikacji ASP.NET nie ma zastosowania do usług WCF hostowanych wewnątrz domeny aplikacji, która zawiera ASP.NET zawartości. Przykłady tych funkcji obejmują następujące elementy:
HttpContext: Current jest zawsze
null
w przypadku uzyskiwania dostępu z poziomu usługi WCF. Użycie w zamian parametru RequestContext.Autoryzacja oparta na plikach: model zabezpieczeń programu WCF nie zezwala na stosowanie listy kontroli dostępu (ACL) do pliku .svc usługi podczas podejmowania decyzji, czy żądanie obsługi jest autoryzowane.
Autoryzacja adresu URL oparta na konfiguracji: podobnie model zabezpieczeń programu WCF nie jest zgodny z żadnymi regułami autoryzacji opartymi na adresach URL określonymi w elemecie konfiguracji autoryzacji> System.Web<. Te ustawienia są ignorowane w przypadku żądań WCF, jeśli usługa znajduje się w przestrzeni adresów URL zabezpieczonej przez reguły autoryzacji adresów URL platformy ASP.NET.
Rozszerzalność modułu HttpModule: infrastruktura hostingu WCF przechwytuje żądania programu WCF po PostAuthenticateRequest wystąpieniu zdarzenia i nie zwraca przetwarzania do potoku http ASP.NET. Moduły kodowane w celu przechwycenia żądań na późniejszych etapach potoku nie przechwytują żądań WCF.
ASP.NET personifikacji: Domyślnie żądania WCF zawsze są uruchamiane jako tożsamość procesu usług IIS, nawet jeśli ASP.NET jest ustawiona w celu włączenia personifikacji przy użyciu personifikacji tożsamości System.Web <personifikat="true" /> opcji konfiguracji.
Te ograniczenia dotyczą tylko usług WCF hostowanych w aplikacji usług IIS. Zachowanie ASP.NET zawartości nie ma wpływu na obecność programu WCF.
Aplikacje WCF, które wymagają funkcji tradycyjnie zapewnianych przez potok HTTP, powinny rozważyć użycie odpowiedników WCF, które są hostem i transportem niezależnym:
OperationContextHttpContextzamiast .
ServiceAuthorizationBehavior zamiast autoryzacji pliku/adresu URL platformy ASP.NET.
IDispatchMessageInspector lub niestandardowe kanały warstwowe zamiast modułów HTTP.
Personifikacja dla każdej operacji przy użyciu programu WCF zamiast personifikacji System.Web.
Alternatywnie możesz rozważyć uruchomienie usług w trybie zgodności ASP.NET WCF.
Hostowanie usług WCF w trybie zgodności ASP.NET
Mimo że model WCF jest zaprojektowany tak, aby zachowywał się spójnie w środowiskach hostingu i transportach, często istnieją scenariusze, w których aplikacja nie wymaga tego stopnia elastyczności. Tryb zgodności ASP.NET programu WCF jest odpowiedni dla scenariuszy, które nie wymagają możliwości hostowania poza usługami IIS lub komunikacji za pośrednictwem protokołów innych niż HTTP, ale korzystają ze wszystkich funkcji platformy aplikacji internetowej ASP.NET.
W przeciwieństwie do domyślnej konfiguracji równoległej, w której infrastruktura hostingu WCF przechwytuje komunikaty WCF i kieruje je z potoku HTTP, usługi WCF działające w trybie zgodności ASP.NET uczestniczą w pełni w cyklu życia żądania HTTP ASP.NET. W trybie zgodności usługi WCF używają potoku HTTP za pośrednictwem IHttpHandler implementacji, podobnie jak w przypadku żądań stron ASPX i usług sieci Web ASMX. W związku z tym program WCF zachowuje się identycznie z programem ASMX w odniesieniu do następujących funkcji ASP.NET:
HttpContext: usługi WCF uruchomione w trybie zgodności ASP.NET mogą uzyskiwać dostęp i Current skojarzony z nim stan.
Autoryzacja oparta na plikach: usługi WCF działające w trybie zgodności ASP.NET można zabezpieczyć, dołączając listy kontroli dostępu systemu plików (ACL) do pliku svc usługi.
Konfigurowalna autoryzacja adresu URL: reguły autoryzacji adresów URL platformy ASP.NET są wymuszane dla żądań WCF, gdy usługa WCF jest uruchomiona w trybie zgodności ASP.NET.
HttpModuleCollection rozszerzalność: ponieważ usługi WCF działające w trybie zgodności ASP.NET uczestniczą w pełni w cyklu życia żądania HTTP ASP.NET, każdy moduł HTTP skonfigurowany w potoku HTTP może działać zarówno na żądaniach WCF, jak i po wywołaniu usługi.
ASP.NET Personifikacja: usługi WCF są uruchamiane przy użyciu bieżącej tożsamości podszywanego wątku ASP.NET, który może być inny niż tożsamość procesu usług IIS, jeśli ASP.NET personifikacja została włączona dla aplikacji. Jeśli ASP.NET personifikacji i personifikacji WCF są włączone dla określonej operacji usługi, implementacja usługi zostanie ostatecznie uruchomiona przy użyciu tożsamości uzyskanej z programu WCF.
Tryb zgodności ASP.NET programu WCF jest włączony na poziomie aplikacji za pomocą następującej konfiguracji (znajdującej się w pliku Web.config aplikacji):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Ta wartość jest domyślnie ustawiona, false
jeśli nie zostanie określona. Wartość parametru false
wskazuje, że wszystkie usługi WCF uruchomione w aplikacji nie będą działać w trybie zgodności ASP.NET.
Ponieważ tryb zgodności ASP.NET oznacza semantyka przetwarzania żądań, które zasadniczo różnią się od domyślnego programu WCF, poszczególne implementacje usług mają możliwość kontrolowania, czy działają wewnątrz aplikacji, dla której włączono tryb zgodności ASP.NET. Usługi mogą używać polecenia AspNetCompatibilityRequirementsAttribute , aby wskazać, czy obsługują one tryb zgodności ASP.NET. Wartość domyślna tego atrybutu to Allowed.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}
W poniższej tabeli przedstawiono sposób interakcji ustawienia trybu zgodności dla całej aplikacji z określonym poziomem obsługi poszczególnych usług:
Ustawienie Tryb zgodności dla całej aplikacji | [AspNetCompatibilityRequirementsMode] Ustawienie |
Obserwowany wynik |
---|---|---|
aspNetCompatibilityEnabled = "true " |
Required | Usługa zostanie pomyślnie aktywowana. |
aspNetCompatibilityEnabled = "true " |
Allowed | Usługa zostanie pomyślnie aktywowana. |
aspNetCompatibilityEnabled = "true " |
NotAllowed | Błąd aktywacji występuje, gdy usługa otrzymuje komunikat. |
aspNetCompatibilityEnabled = "false " |
Required | Błąd aktywacji występuje, gdy usługa otrzymuje komunikat. |
aspNetCompatibilityEnabled = "false " |
Allowed | Usługa zostanie pomyślnie aktywowana. |
aspNetCompatibilityEnabled = "false " |
NotAllowed | Usługa zostanie pomyślnie aktywowana. |
Uwaga
Usługi IIS 7.0 i WAS umożliwiają usługom WCF komunikację za pośrednictwem protokołów innych niż HTTP. Jednak usługi WCF uruchomione w aplikacjach z włączonym trybem zgodności ASP.NET nie mogą uwidaczniać punktów końcowych innych niż HTTP. Taka konfiguracja generuje wyjątek aktywacji, gdy usługa odbiera swój pierwszy komunikat.
Aby uzyskać więcej informacji na temat włączania trybu zgodności ASP.NET dla usług WCF, zobacz AspNetCompatibilityRequirementsMode i przykład zgodności ASP.NET.