WCF-tjänster och ASP.NET
I det här avsnittet beskrivs värdtjänsten för WCF-tjänster (Windows Communication Foundation) sida vid sida med ASP.NET och värd för dem i ASP.NET kompatibilitetsläge.
Värd för WCF sida vid sida med ASP.NET
WCF-tjänster som finns i Internet Information Services (IIS) kan finnas med . ASPX-sidor och ASMX-webbtjänster i en enda gemensam programdomän. ASP.NET tillhandahåller vanliga infrastrukturtjänster som AppDomain-hantering och dynamisk kompilering för både WCF och ASP.NET HTTP-körning. Standardkonfigurationen för WCF är sida vid sida med ASP.NET.
den ASP.NET HTTP-körningen hanterar ASP.NET begäranden men deltar inte i bearbetningen av begäranden som är avsedda för WCF-tjänster, även om dessa tjänster finns i samma AppDomain som det ASP.NET innehållet. I stället fångar WCF-tjänstmodellen upp meddelanden som är adresserade till WCF-tjänster och dirigerar dem genom WCF-transport-/kanalstacken.
Resultatet av modellen sida vid sida är följande:
ASP.NET- och WCF-tjänster kan dela AppDomain-tillstånd. Eftersom de två ramverken kan samexistera i samma AppDomain kan WCF också dela AppDomain-tillstånd med ASP.NET (inklusive statiska variabler, händelser och så vidare).
WCF-tjänster fungerar konsekvent, oberoende av värdmiljö och transport. Den ASP.NET HTTP-körningen är avsiktligt kopplad till IIS/ASP.NET-värdmiljön och HTTP-kommunikationen. Omvänt är WCF utformat för att fungera konsekvent i värdmiljöer (WCF beter sig konsekvent både inom och utanför IIS) och över transport (en tjänst som finns i IIS 7.0 och senare har konsekvent beteende över alla slutpunkter som exponeras, även om vissa av dessa slutpunkter använder andra protokoll än HTTP).
I en AppDomain gäller funktioner som implementeras av HTTP-körningen för ASP.NET innehåll men inte för WCF. Många HTTP-specifika funktioner i ASP.NET programplattform gäller inte för WCF-tjänster som finns i en AppDomain som innehåller ASP.NET innehåll. Exempel på dessa funktioner är följande:
HttpContext: Current är alltid
null
när den nås från en WCF-tjänst. Använd RequestContext i stället.Filbaserad auktorisering: WCF-säkerhetsmodellen tillåter inte åtkomstkontrollistan (ACL) som tillämpas på .svc-filen för tjänsten när du bestämmer om en tjänstbegäran är auktoriserad.
Konfigurationsbaserad URL-auktorisering: På samma sätt följer WCF-säkerhetsmodellen inte några URL-baserade auktoriseringsregler som anges i System.Webs auktoriseringskonfigurationselement<>. De här inställningarna ignoreras för WCF-begäranden om en tjänst finns i ett URL-utrymme som skyddas av ASP.NET:s URL-auktoriseringsregler.
Utökningsbarhet för HttpModule: WCF-värdinfrastrukturen fångar upp WCF-begäranden när PostAuthenticateRequest händelsen utlöses och returnerar inte bearbetning till den ASP.NET HTTP-pipelinen. Moduler som kodas för att avlyssna begäranden i senare skeden av pipelinen fångar inte upp WCF-begäranden.
ASP.NET personifiering: Som standard körs WCF-begäranden alltid som IIS-processidentitet, även om ASP.NET är inställt på att aktivera personifiering med hjälp av system.web-identitetspersonifiering <="true"/> konfigurationsalternativ.
Dessa begränsningar gäller endast för WCF-tjänster som finns i IIS-programmet. Beteendet för ASP.NET innehåll påverkas inte av förekomsten av WCF.
WCF-program som kräver funktioner som traditionellt tillhandahålls av HTTP-pipelinen bör överväga att använda WCF-motsvarigheterna, som är värd- och transportoberoende:
OperationContextHttpContexti stället för .
ServiceAuthorizationBehavior i stället för ASP.NET:s fil-/URL-auktorisering.
IDispatchMessageInspector eller anpassade skiktade kanaler i stället för HTTP-moduler.
Personifiering för varje åtgärd som använder WCF i stället för System.Web-personifiering.
Du kan också överväga att köra dina tjänster i WCF:s ASP.NET kompatibilitetsläge.
Värd för WCF-tjänster i ASP.NET kompatibilitetsläge
Även om WCF-modellen är utformad för att fungera konsekvent i värdmiljöer och transporter, finns det ofta scenarier där ett program inte kräver den här graden av flexibilitet. WCF:s ASP.NET kompatibilitetsläge är lämpligt för scenarier som inte kräver möjligheten att vara värd utanför IIS eller kommunicera via andra protokoll än HTTP, men som använder alla funktioner i ASP.NET webbprogramplattform.
Till skillnad från standardkonfigurationen sida vid sida, där WCF-värdinfrastrukturen fångar upp WCF-meddelanden och dirigerar dem ut ur HTTP-pipelinen, deltar WCF-tjänster som körs i ASP.NET kompatibilitetsläge fullt ut i livscykeln för ASP.NET HTTP-begäran. I kompatibilitetsläge använder WCF-tjänster HTTP-pipelinen via en IHttpHandler implementering, på samma sätt som begäranden för ASPX-sidor och ASMX-webbtjänster hanteras. Därför fungerar WCF identiskt med ASMX med avseende på följande ASP.NET funktioner:
HttpContext: WCF-tjänster som körs i ASP.NET kompatibilitetsläge kan komma åt Current och dess associerade tillstånd.
Filbaserad auktorisering: WCF-tjänster som körs i ASP.NET kompatibilitetsläge kan vara säkra genom att koppla filsystemåtkomstkontrollistor (ACL: er) till tjänstens .svc-fil.
Konfigurerbar URL-auktorisering: ASP.NET:s URL-auktoriseringsregler tillämpas för WCF-begäranden när WCF-tjänsten körs i ASP.NET kompatibilitetsläge.
HttpModuleCollection utökningsbarhet: Eftersom WCF-tjänster som körs i ASP.NET kompatibilitetsläge deltar fullt ut i ASP.NET HTTP-begärandelivscykel kan alla HTTP-moduler som konfigurerats i HTTP-pipelinen fungera på WCF-begäranden både före och efter tjänstanrop.
ASP.NET Personifiering: WCF-tjänster körs med den aktuella identiteten för den ASP.NET personifierade tråden, vilket kan skilja sig från IIS-processidentiteten om ASP.NET personifiering har aktiverats för programmet. Om både ASP.NET personifiering och WCF-personifiering är aktiverade för en viss tjänståtgärd körs tjänstimplementeringen i slutändan med hjälp av den identitet som hämtas från WCF.
WCF:s ASP.NET kompatibilitetsläge aktiveras på programnivå via följande konfiguration (finns i programmets Web.config-fil):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Det här värdet är standardvärdet false
om det inte anges. Värdet false
för anger att alla WCF-tjänster som körs i programmet inte körs i ASP.NET kompatibilitetsläge.
Eftersom ASP.NET Kompatibilitetsläge innebär att semantik för bearbetning av begäranden skiljer sig från WCF-standardinställningen kan enskilda tjänstimplementeringar styra om de körs i ett program som ASP.NET kompatibilitetsläge har aktiverats för. Tjänster kan använda för AspNetCompatibilityRequirementsAttribute att ange om de stöder ASP.NET kompatibilitetsläge. Standardvärdet för attributet är Allowed.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}
I följande tabell visas hur inställningen för programomfattande kompatibilitetsläge interagerar med den enskilda tjänstens angivna supportnivå:
Inställning för programomfattande kompatibilitetsläge | [AspNetCompatibilityRequirementsMode] Inställning |
Observerat resultat |
---|---|---|
aspNetCompatibilityEnabled = "true " |
Required | Tjänsten aktiveras. |
aspNetCompatibilityEnabled = "true " |
Allowed | Tjänsten aktiveras. |
aspNetCompatibilityEnabled = "true " |
NotAllowed | Ett aktiveringsfel uppstår när tjänsten tar emot ett meddelande. |
aspNetCompatibilityEnabled = "false " |
Required | Ett aktiveringsfel uppstår när tjänsten tar emot ett meddelande. |
aspNetCompatibilityEnabled = "false " |
Allowed | Tjänsten aktiveras. |
aspNetCompatibilityEnabled = "false " |
NotAllowed | Tjänsten aktiveras. |
Kommentar
Med IIS 7.0 och WAS kan WCF-tjänster kommunicera via andra protokoll än HTTP. WCF-tjänster som körs i program som har aktiverat ASP.NET kompatibilitetsläge tillåts dock inte att exponera icke-HTTP-slutpunkter. En sådan konfiguration genererar ett aktiveringsfel när tjänsten tar emot sitt första meddelande.
Mer information om hur du aktiverar ASP.NET kompatibilitetsläge för WCF-tjänster AspNetCompatibilityRequirementsMode finns i exemplet ASP.NET Kompatibilitet .