WCF-services en -ASP.NET
In dit onderwerp worden WCF-services (Windows Communication Foundation) naast ASP.NET gehost en gehost in ASP.NET compatibiliteitsmodus.
WCF naast ASP.NET hosten
WCF-services die worden gehost in IIS (Internet Information Services) kunnen zich bevinden. ASPX-pagina's en ASMX-webservices binnen één gemeenschappelijk toepassingsdomein. ASP.NET biedt algemene infrastructuurservices zoals AppDomain-beheer en dynamische compilatie voor zowel WCF als de ASP.NET HTTP-runtime. De standaardconfiguratie voor WCF is naast ASP.NET.
De ASP.NET HTTP-runtime verwerkt ASP.NET aanvragen, maar neemt niet deel aan de verwerking van aanvragen die bestemd zijn voor WCF-services, ook al worden deze services gehost in hetzelfde AppDomain als de ASP.NET inhoud. In plaats daarvan onderschept het WCF-servicemodel berichten die zijn geadresseerd aan WCF-services en stuurt deze door de WCF-transport-/kanaalstack.
De resultaten van het side-by-side model zijn als volgt:
ASP.NET- en WCF-services kunnen de status AppDomain delen. Omdat de twee frameworks naast elkaar kunnen bestaan in hetzelfde AppDomain, kan WCF ook de status AppDomain delen met ASP.NET (inclusief statische variabelen, gebeurtenissen enzovoort).
WCF-services gedragen zich consistent, onafhankelijk van hostingomgeving en transport. De ASP.NET HTTP-runtime is opzettelijk gekoppeld aan de IIS/ASP.NET-hostingomgeving en HTTP-communicatie. Omgekeerd is WCF ontworpen om zich consistent te gedragen in hostingomgevingen (WCF gedraagt zich consistent zowel binnen als buiten IIS) en voor transport (een service die wordt gehost in IIS 7.0 en hoger heeft consistent gedrag voor alle eindpunten die beschikbaar zijn, zelfs als sommige van deze eindpunten andere protocollen dan HTTP gebruiken).
Binnen een AppDomain zijn functies die door de HTTP-runtime zijn geïmplementeerd, van toepassing op ASP.NET inhoud, maar niet op WCF. Veel HTTP-specifieke functies van het ASP.NET toepassingsplatform zijn niet van toepassing op WCF-services die worden gehost in een AppDomain dat ASP.NET inhoud bevat. Voorbeelden van deze functies zijn:
HttpContext: Current is altijd
null
toegankelijk vanuit een WCF-service. Gebruik in plaats daarvan RequestContext.Autorisatie op basis van bestanden: het WCF-beveiligingsmodel staat niet toe dat de toegangsbeheerlijst (ACL) wordt toegepast op het .svc-bestand van de service wanneer wordt bepaald of een serviceaanvraag is geautoriseerd.
Op configuratie gebaseerde URL-autorisatie: op dezelfde manier voldoet het WCF-beveiligingsmodel niet aan eventuele op URL's gebaseerde autorisatieregels die zijn opgegeven in het autorisatieconfiguratie-element> van <System.Web. Deze instellingen worden genegeerd voor WCF-aanvragen als een service zich in een URL-ruimte bevindt die wordt beveiligd door de URL-autorisatieregels van ASP.NET.
HttpModule-uitbreidbaarheid: De WCF-hostinginfrastructuur onderschept WCF-aanvragen wanneer de PostAuthenticateRequest gebeurtenis wordt gegenereerd en retourneert geen verwerking naar de ASP.NET HTTP-pijplijn. Modules die zijn gecodeerd om aanvragen in latere fasen van de pijplijn te onderscheppen, onderscheppen WCF-aanvragen niet.
ASP.NET imitatie: WCF-aanvragen worden standaard altijd uitgevoerd als de IIS-procesidentiteit, zelfs als ASP.NET is ingesteld om imitatie in te schakelen met behulp van system.Web's <identity impersonate="true" /> configuratieoptie.
Deze beperkingen gelden alleen voor WCF-services die worden gehost in de IIS-toepassing. Het gedrag van ASP.NET inhoud wordt niet beïnvloed door de aanwezigheid van WCF.
WCF-toepassingen waarvoor traditioneel functionaliteit van de HTTP-pijplijn is vereist, moeten overwegen de WCF-equivalenten te gebruiken, die host- en transportonafhankelijk zijn:
OperationContext in plaats van HttpContext.
ServiceAuthorizationBehavior in plaats van de bestands-/URL-autorisatie van ASP.NET.
IDispatchMessageInspector of aangepaste gelaagde kanalen in plaats van HTTP-modules.
Imitatie voor elke bewerking met WCF in plaats van System.Web-imitatie.
U kunt ook overwegen om uw services uit te voeren in de ASP.NET compatibiliteitsmodus van WCF.
WCF-services hosten in ASP.NET compatibiliteitsmodus
Hoewel het WCF-model is ontworpen om zich consistent te gedragen in hostingomgevingen en transporten, zijn er vaak scenario's waarbij een toepassing deze mate van flexibiliteit niet vereist. De ASP.NET compatibiliteitsmodus van WCF is geschikt voor scenario's die niet de mogelijkheid nodig hebben om buiten IIS te hosten of te communiceren via andere protocollen dan HTTP, maar die gebruikmaken van alle functies van het ASP.NET webtoepassingsplatform.
In tegenstelling tot de standaardconfiguratie naast elkaar, waarbij de WCF-hostinginfrastructuur WCF-berichten onderschept en deze routeert uit de HTTP-pijplijn, nemen WCF-services die worden uitgevoerd in ASP.NET compatibiliteitsmodus volledig deel aan de levenscyclus van de ASP.NET HTTP-aanvraag. In de compatibiliteitsmodus gebruiken WCF-services de HTTP-pijplijn via een IHttpHandler implementatie, vergelijkbaar met de manier waarop aanvragen voor ASPX-pagina's en ASMX-webservices worden verwerkt. Als gevolg hiervan gedraagt WCF zich identiek aan ASMX met betrekking tot de volgende ASP.NET functies:
HttpContext: WCF-services die worden uitgevoerd in ASP.NET compatibiliteitsmodus hebben toegang tot Current en de bijbehorende status.
Autorisatie op basis van bestanden: WCF-services die worden uitgevoerd in ASP.NET compatibiliteitsmodus kunnen worden beveiligd door toegangsbeheerlijsten (ACL's) van het bestandssysteem toe te voegen aan het .svc-bestand van de service.
Configureerbare URL-autorisatie: DE URL-autorisatieregels van ASP.NET worden afgedwongen voor WCF-aanvragen wanneer de WCF-service wordt uitgevoerd in ASP.NET compatibiliteitsmodus.
HttpModuleCollection uitbreidbaarheid: omdat WCF-services die worden uitgevoerd in ASP.NET compatibiliteitsmodus volledig deelnemen aan de ASP.NET levenscyclus van de HTTP-aanvraag, kan elke HTTP-module die is geconfigureerd in de HTTP-pijplijn, zowel vóór als na aanroepen van services werken.
ASP.NET imitatie: WCF-services worden uitgevoerd met behulp van de huidige identiteit van de ASP.NET geïmiteerde thread, die mogelijk anders is dan de IIS-procesidentiteit als ASP.NET imitatie is ingeschakeld voor de toepassing. Als ASP.NET imitatie en WCF-imitatie beide zijn ingeschakeld voor een bepaalde servicebewerking, wordt de service-implementatie uiteindelijk uitgevoerd met behulp van de identiteit die is verkregen uit WCF.
De ASP.NET compatibiliteitsmodus van WCF is ingeschakeld op toepassingsniveau via de volgende configuratie (in het web.config-bestand van de toepassing):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Deze waarde wordt standaard ingesteld false
als deze niet is opgegeven. De waarde van false
geeft aan dat alle WCF-services die in de toepassing worden uitgevoerd, niet worden uitgevoerd in ASP.NET compatibiliteitsmodus.
Omdat ASP.NET compatibiliteitsmodus impliceert dat aanvragen worden verwerkt die fundamenteel verschillen van de WCF-standaard, kunnen afzonderlijke service-implementaties bepalen of ze worden uitgevoerd in een toepassing waarvoor ASP.NET compatibiliteitsmodus is ingeschakeld. Services kunnen de AspNetCompatibilityRequirementsAttribute functie gebruiken om aan te geven of ze ondersteuning bieden voor ASP.NET compatibiliteitsmodus. De standaardwaarde voor dit kenmerk is Allowed.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}
In de volgende tabel ziet u hoe de compatibiliteitsmodusinstelling voor de hele toepassing communiceert met het opgegeven ondersteuningsniveau van de afzonderlijke service:
Instelling voor de compatibiliteitsmodus voor de hele toepassing | [AspNetCompatibilityRequirementsMode] Instelling |
Waargenomen resultaat |
---|---|---|
aspNetCompatibilityEnabled = "true " |
Required | De service wordt geactiveerd. |
aspNetCompatibilityEnabled = "true " |
Allowed | De service wordt geactiveerd. |
aspNetCompatibilityEnabled = "true " |
NotAllowed | Er treedt een activeringsfout op wanneer de service een bericht ontvangt. |
aspNetCompatibilityEnabled = "false " |
Required | Er treedt een activeringsfout op wanneer de service een bericht ontvangt. |
aspNetCompatibilityEnabled = "false " |
Allowed | De service wordt geactiveerd. |
aspNetCompatibilityEnabled = "false " |
NotAllowed | De service wordt geactiveerd. |
Notitie
MET IIS 7.0 en WAS kunnen WCF-services communiceren via andere protocollen dan HTTP. WCF-services die worden uitgevoerd in toepassingen waarvoor ASP.NET compatibiliteitsmodus zijn ingeschakeld, zijn echter niet toegestaan om niet-HTTP-eindpunten beschikbaar te maken. Een dergelijke configuratie genereert een activeringsonderzondering wanneer de service het eerste bericht ontvangt.
Zie het ASP.NET compatibiliteitsvoorbeeld voor WCF-services voor meer informatie over het inschakelen van ASP.NET compatibiliteitsmodus voor WCF-servicesAspNetCompatibilityRequirementsMode.