Teilen über


WCF-Dienste und ASP.NET

In diesem Thema wird das Hosten von Windows Communication Foundation (WCF)-Diensten parallel mit ASP.NET und das Hosten in ASP.NET Kompatibilitätsmodus erläutert.

Paralleles Hosten von WCF mit ASP.NET

WCF-Dienste, die in Internet Information Services (IIS) gehostet werden, können mit .ASPX-Seiten und ASMX-Webdiensten innerhalb einer einzigen, gemeinsamen Anwendungsdomäne platziert werden. ASP.NET stellt allgemeine Infrastrukturdienste wie AppDomain-Verwaltung und dynamische Kompilierung sowohl für WCF als auch für die ASP.NET HTTP-Laufzeit bereit. Die Standardkonfiguration für WCF erfolgt in Verbindung mit ASP.NET.

Screenshot: WCF-Dienste und ASP.NET: Teilungsstatus

Die ASP.NET HTTP-Laufzeit verarbeitet ASP.NET Anforderungen, nimmt jedoch nicht an der Verarbeitung von Anforderungen teil, die für WCF-Dienste bestimmt sind, obwohl diese Dienste in derselben AppDomain gehostet werden wie der ASP.NET Inhalt. Stattdessen fängt das WCF-Dienstmodell Nachrichten ab, die an WCF-Dienste adressiert sind, und leitet sie über den WCF-Transport-/Kanalstapel weiter.

Die Ergebnisse des parallelen Modells sind wie folgt:

  • ASP.NET und WCF-Dienste können den AppDomain-Status freigeben. Da die beiden Frameworks in derselben AppDomain koexistieren können, kann WCF den AppDomain-Zustand auch mit ASP.NET teilen (einschließlich statischer Variablen, Ereignisse usw.).

  • WCF-Dienste verhalten sich konsistent, unabhängig von Hostingumgebung und Transport. Die ASP.NET HTTP-Laufzeit wird absichtlich mit der IIS/ASP.NET-Hostingumgebung und der HTTP-Kommunikation gekoppelt. Umgekehrt ist WCF so konzipiert, dass es sich konsistent in Hostingumgebungen verhält (WCF verhält sich sowohl innerhalb als auch außerhalb von IIS) und über den Transport hinweg (ein in IIS 7.0 gehosteter Dienst und höher hat ein konsistentes Verhalten über alle verfügbaren Endpunkte hinweg, auch wenn einige dieser Endpunkte andere Protokolle als HTTP verwenden).

  • Innerhalb einer AppDomain gelten Features, die von der HTTP-Laufzeit implementiert werden, für ASP.NET-Inhalte, aber nicht für WCF. Viele HTTP-spezifische Features der ASP.NET Anwendungsplattform gelten nicht für WCF-Dienste, die in einer AppDomain gehostet werden, die ASP.NET Inhalt enthält. Beispiele für diese Features sind die folgenden:

    • HttpContext: Current ist immer null bei Zugriff von einem WCF-Dienst aus. Verwenden Sie stattdessen RequestContext.

    • Dateibasierte Autorisierung: Das WCF-Sicherheitsmodell lässt keine Zugriffssteuerungsliste (Access Control List, ACL) zu, die auf die SVC-Datei des Diensts angewendet wird, wenn sie entscheiden, ob eine Dienstanforderung autorisiert ist.

    • Konfigurationsbasierte URL-Autorisierung: Entsprechend entspricht das WCF-Sicherheitsmodell keine URL-basierten Autorisierungsregeln, die im Autorisierungskonfigurationselement <> von System.Web angegeben sind. Diese Einstellungen werden für WCF-Anforderungen ignoriert, wenn sich ein Dienst in einem URL-Bereich befindet, der durch die URL-Autorisierungsregeln von ASP.NET gesichert ist.

    • HttpModule-Erweiterbarkeit: Die WCF-Hostinginfrastruktur fängt WCF-Anforderungen ab, wenn das PostAuthenticateRequest Ereignis ausgelöst wird, und gibt keine Verarbeitung an die ASP.NET HTTP-Pipeline zurück. Module, die codiert sind, um Anforderungen in späteren Phasen der Pipeline abzufangen, abfangen keine WCF-Anforderungen ab.

    • ASP.NET-Impersonation: Standardmäßig werden WCF-Anforderungen immer als IIS-Prozessidentität ausgeführt, auch wenn ASP.NET so konfiguriert ist, dass der Identitätswechsel mit der Konfigurationsoption identity impersonate="true" von System.Web aktiviert wird.

Diese Einschränkungen gelten nur für WCF-Dienste, die in der IIS-Anwendung gehostet werden. Das Verhalten von ASP.NET Inhalten ist von der Anwesenheit von WCF nicht betroffen.

WCF-Anwendungen, die funktionen erfordern, die traditionell von der HTTP-Pipeline bereitgestellt werden, sollten die Verwendung der WCF-Entsprechungen in Betracht ziehen, die host- und transportunabhängig sind:

Alternativ können Sie die Ausführung Ihrer Dienste im ASP.NET Kompatibilitätsmodus von WCF in Betracht ziehen.

Hosten von WCF-Diensten im ASP.NET Kompatibilitätsmodus

Obwohl das WCF-Modell so konzipiert ist, dass es sich einheitlich in Hostingumgebungen und Transporten verhält, gibt es häufig Szenarien, in denen eine Anwendung dieses Maß an Flexibilität nicht erfordert. Der ASP.NET Kompatibilitätsmodus von WCF eignet sich für Szenarien, die nicht die Möglichkeit erfordern, außerhalb von IIS zu hosten oder über andere Protokolle als HTTP zu kommunizieren, aber alle Features der ASP.NET Webanwendungsplattform verwenden.

Im Gegensatz zur standardmäßigen parallelen Konfiguration, bei der die WCF-Hostinginfrastruktur WCF-Nachrichten abfangen und sie aus der HTTP-Pipeline weiter leitet, nehmen WCF-Dienste, die im ASP.NET Kompatibilitätsmodus ausgeführt werden, vollständig am ASP.NET HTTP-Anforderungslebenszyklus teil. Im Kompatibilitätsmodus verwenden WCF-Dienste die HTTP-Pipeline über eine IHttpHandler Implementierung, ähnlich wie Anforderungen für ASPX-Seiten und ASMX-Webdienste. Daher verhält sich WCF in Bezug auf die folgenden ASP.NET Features identisch mit ASMX:

  • HttpContext: WCF-Dienste, die im ASP.NET-Kompatibilitätsmodus ausgeführt werden, können auf Current und dessen zugehörigen Zustand zugreifen.

  • Dateibasierte Autorisierung: WCF-Dienste, die im ASP.NET Kompatibilitätsmodus ausgeführt werden, können sicher sein, indem Dateisystemzugriffssteuerungslisten (ACLs) an die SVC-Datei des Diensts angefügt werden.

  • Konfigurierbare URL-Autorisierung: DIE URL-Autorisierungsregeln von ASP.NET werden für WCF-Anforderungen erzwungen, wenn der WCF-Dienst im ASP.NET Kompatibilitätsmodus ausgeführt wird.

  • HttpModuleCollection Erweiterbarkeit: Da WCF-Dienste, die im ASP.NET Kompatibilitätsmodus ausgeführt werden, vollständig am ASP.NET HTTP-Anforderungslebenszyklus teilnehmen, kann jedes in der HTTP-Pipeline konfigurierte HTTP-Modul sowohl vor als auch nach dem Dienstaufruf auf WCF-Anforderungen ausgeführt werden.

  • ASP.NET-Identitätswechsel: WCF-Dienste werden unter Verwendung der aktuellen Identität des ASP.NET-Identitätswechsel-Threads ausgeführt, die sich möglicherweise von der IIS-Prozessidentität unterscheidet, falls ASP.NET-Identitätswechsel für die Anwendung aktiviert wurde. Wenn ASP.NET-Identitätswechsel und WCF-Identitätswechsel für eine bestimmte Dienstoperation aktiviert sind, wird die Dienstimplementierung schließlich mit der Identität ausgeführt, die von WCF erhalten wird.

Der ASP.NET-Kompatibilitätsmodus von WCF wird über die folgende Konfiguration (in der Web.config-Datei der Anwendung) auf Anwendungsebene aktiviert:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

Dieser Wert wird standardmäßig auf false gesetzt, wenn er nicht angegeben ist. Der Wert gibt false an, dass alle WCF-Dienste, die in der Anwendung ausgeführt werden, nicht im ASP.NET Kompatibilitätsmodus ausgeführt werden.

Da ASP.NET Kompatibilitätsmodus Anforderungsverarbeitungsemantik impliziert, die sich grundlegend von der WCF-Standardeinstellung unterscheiden, können einzelne Dienstimplementierungen steuern, ob sie innerhalb einer Anwendung ausgeführt werden, für die ASP.NET Kompatibilitätsmodus aktiviert wurde. Dienste können verwenden AspNetCompatibilityRequirementsAttribute , um anzugeben, ob sie ASP.NET Kompatibilitätsmodus unterstützen. Der Standardwert für dieses Attribut ist Allowed.

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}

In der folgenden Tabelle wird veranschaulicht, wie die anwendungsweite Kompatibilitätsmoduseinstellung mit der angegebenen Unterstützungsebene des einzelnen Diensts interagiert:

Einstellung für den anwendungsweiten Kompatibilitätsmodus [AspNetCompatibilityRequirementsMode]

Konfiguration
Beobachtetes Ergebnis
aspNetCompatibilityEnabled = "true" Required Der Dienst wird erfolgreich aktiviert.
aspNetCompatibilityEnabled = "true" Allowed Der Dienst wird erfolgreich aktiviert.
aspNetCompatibilityEnabled = "true" NotAllowed Ein Aktivierungsfehler tritt auf, wenn der Dienst eine Nachricht empfängt.
aspNetCompatibilityEnabled = "false" Required Ein Aktivierungsfehler tritt auf, wenn der Dienst eine Nachricht empfängt.
aspNetCompatibilityEnabled = "false" Allowed Der Dienst wird erfolgreich aktiviert.
aspNetCompatibilityEnabled = "false" NotAllowed Der Dienst wird erfolgreich aktiviert.

Hinweis

IIS 7.0 und WAS ermöglicht WCF-Diensten die Kommunikation über andere Protokolle als HTTP. WCF-Dienste, die in Anwendungen ausgeführt werden, die den ASP.NET-Kompatibilitätsmodus aktiviert haben, dürfen jedoch keine Nicht-HTTP-Endpunkte freigeben. Eine solche Konfiguration generiert eine Aktivierungs ausnahme, wenn der Dienst die erste Nachricht empfängt.

Weitere Informationen zum Aktivieren des ASP.NET-Kompatibilitätsmodus für WCF-Dienste finden Sie im AspNetCompatibilityRequirementsModeASP.NET-Kompatibilitätsbeispiel.

Siehe auch