Servizi WCF e ASP.NET

Questo argomento illustra l'hosting di servizi Windows Communication Foundation (WCF) side-by-side con ASP.NET e l'hosting in modalità di compatibilità ASP.NET.

Hosting di WCF affiancato ad ASP.NET

I servizi WCF ospitati in Internet Information Services (IIS) possono trovarsi con pagine ASPX e servizi Web ASMX all'interno di un solo dominio applicazione comune. ASP.NET prevede servizi di infrastruttura comuni, quali la gestione del dominio dell'applicazione e la compilazione dinamica del runtime HTTP WCF e ASP.NET. La configurazione predefinita per WCF è quella affiancata ad ASP.NET.

Screenshot showing WCF Services and ASP .NET: sharing state.

Il runtime HTTP ASP.NET gestisce richieste ASP.NET ma non partecipa all'elaborazione delle richieste destinate a servizi WCF, anche se questi servizi sono ospitati nello stesso AppDomain del contenuto ASP.NET. Il modello di servizi WCF intercetta invece i messaggi indirizzati a servizi WCF e li instrada tramite lo stack di trasporto/canale WCF.

I risultati del modello affiancato sono i seguenti:

  • ASP.NET e i servizi WCF possono condividere lo stato dell'AppDomain. Poiché i due framework possono coesistere nello stesso AppDomain, WCF può condividere anche lo stato dell'AppDomain con ASP.NET (inclusi variabili statiche, eventi e così via).

  • I servizi WCF si comportano coerentemente, indipendentemente dall'ambiente host e dal trasporto. Il runtime HTTP ASP.NET è intenzionalmente accoppiato all'ambiente host IIS/ASP.NET e alla comunicazione HTTP. Al contrario, WCF è progettato per comportarsi coerentemente in diversi ambienti host (WCF si comporta coerentemente all'interno e all'esterno di IIS) e trasporti (un servizio ospitato in IIS 7.0 e versioni successive ha un comportamento coerente in tutti gli endpoint che espone, anche se alcuni di questi usano protocolli diversi da HTTP).

  • All'interno di un AppDomain, le funzionalità implementate dal runtime HTTP si applicano al contenuto ASP.NET ma non a WCF. Molte funzionalità specifiche di HTTP della piattaforma dell'applicazione ASP.NET non si applicano ai servizi WCF ospitati in un AppDomain con contenuto ASP.NET. Ne sono esempi le seguenti:

    • HttpContext: la proprietà Current è sempre null quando vi si accede da un servizio WCF. Utilizzare invece RequestContext.

    • Autorizzazione basata su file: il modello di sicurezza WCF non consente l'elenco di controllo di accesso (ACL) applicato al file con estensione svc quando si decide se la richiesta di un servizio è autorizzata.

    • Autorizzazione URL basata sulla configurazione: allo stesso modo, il modello di sicurezza WCF non segue alcuna regola di autorizzazione basata su URL specificata nell'elemento di configurazione <authorization> di System.Web. Queste impostazioni vengono ignorate per WCF, se un servizio risiede in un spazio URL protetto da regole di autorizzazione URL ASP.NET.

    • Estensibilità di HttpModule: l'infrastruttura di hosting WCF intercetta le richieste WCF quando viene generato l'evento PostAuthenticateRequest e non restituisce elaborazione alla pipeline HTTP ASP.NET. I moduli codificati per intercettare richieste in fasi successive della pipeline non intercettano richieste WCF.

    • Rappresentazione ASP.NET: per impostazione predefinita, le richieste WCF vengono sempre eseguite come identità del processo IIS, anche se ASP.NET è impostato per consentire la rappresentazione mediante l'opzione di configurazione <identity impersonate=”true” /> di System.Web.

Queste restrizioni si applicano solo ai servizi WCF ospitati nell'applicazione IIS. Il comportamento del contenuto ASP.NET non viene influenzato dalla presenza di WCF.

Le applicazioni WCF che richiedono funzionalità tradizionalmente fornite dalla pipeline HTTP dovrebbero considerare l'uso di equivalenti di WCF, indipendenti dall'host e dal trasporto:

In alternativa, è possibile considerare l'esecuzione dei servizi in modalità di compatibilità ASP.NET di WCF.

Hosting dei servizi WCF in modalità di compatibilità ASP.NET

Sebbene il modello WCF sia progettato per comportarsi in modo coerente in diversi ambienti host e trasporti, sono frequenti gli scenari in cui un'applicazione non richiede tale grado di flessibilità. La modalità di compatibilità ASP.NET di WCF è adatta agli scenari che non richiedono la possibilità di hosting all'esterno di IIS o di comunicazione su protocolli diversi da HTTP, ma in cui vengono usate tutte le funzionalità della piattaforma dell'applicazione Web ASP.NET.

A differenza della configurazione affiancata predefinita, in cui l'infrastruttura di hosting WCF intercetta i messaggi WCF e li instrada fuori dalla pipeline HTTP, i servizi WCF in esecuzione in modalità di compatibilità ASP.NET partecipano completamente al ciclo di vita delle richieste HTTP ASP.NET. In modalità di compatibilità, i servizi WCF usano la pipeline HTTP tramite un'implementazione IHttpHandler, analogamente alla al modo in cui vengono gestite le richieste di pagine ASPX e servizi Web ASMX. Di conseguenza, WCF si comporta in modo identico ad ASMX in relazione alle funzionalità ASP.NET seguenti:

  • HttpContext: i servizi WCF in esecuzione in modalità di compatibilità ASP.NET possono accedere a Current e al relativo stato associato.

  • Autorizzazione basata su file: i servizi WCF in esecuzione in modalità di compatibilità ASP.NET possono essere protetti collegando elenchi di controllo di accesso (ACL) al file system al file con estensione svc del servizio.

  • Autorizzazione URL configurabile: le regole di autorizzazione URL ASP.NET vengono applicate alle richieste WCF quando il servizio WCF è in esecuzione in modalità di compatibilità ASP.NET.

  • Estensibilità di HttpModuleCollection: poiché i servizi WCF in esecuzione in modalità di compatibilità ASP.NET partecipano completamente al ciclo di vita delle richieste HTTP ASP.NET, qualsiasi modulo HTTP configurato nella pipeline HTTP è in grado di operare su richieste WCF prima e dopo la chiamata al servizio.

  • Rappresentazione ASP.NET: i servizi WCF vengono eseguiti usando l'identità corrente del thread rappresentato ASP.NET, che può essere diverso dall'identità del processo IIS se la rappresentazione ASP.NET è stata abilitata per l'applicazione. Se la rappresentazione ASP.NET e la rappresentazione WCF sono entrambe abilitate per una particolare operazione del servizio, l'implementazione del servizio verrà eseguita usando l'identità ottenuta da WCF.

La modalità di compatibilità ASP.NET di WCF viene abilitata a livello dell'applicazione tramite la configurazione seguente, presente nel file Web.config dell'applicazione:

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

Se non viene specificato, questo valore viene automaticamente impostato su false. Il valore di false indica che tutti i servizi WCF in esecuzione nell'applicazione non verranno eseguiti in modalità compatibilità ASP.NET.

Poiché la modalità di compatibilità ASP.NET implica una semantica di elaborazione delle richieste sostanzialmente diversa dall'impostazione predefinita di WCF, le singole implementazione del servizio hanno la possibilità di controllare se vengono eseguite all'interno di un'applicazione per cui è stata attivata la modalità di compatibilità ASP.NET. I servizi possono usare AspNetCompatibilityRequirementsAttribute per indicare se supportano la modalità di compatibilità ASP.NET. Il valore predefinito di questo attributo è Allowed.

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

Nella tabella seguente viene illustrato in che modo l'impostazione della modalità di compatibilità a livello di applicazione interagisce con il livello di supporto dichiarato del singolo servizio:

Impostazione della modalità di compatibilità a livello di applicazione [AspNetCompatibilityRequirementsMode]

Impostazione
Risultato osservato
aspNetCompatibilityEnabled = "true" Required Servizio correttamente attivato.
aspNetCompatibilityEnabled = "true" Allowed Servizio correttamente attivato.
aspNetCompatibilityEnabled = "true" NotAllowed Errore di attivazione durante la ricezione di un messaggio da parte del servizio.
aspNetCompatibilityEnabled = "false" Required Errore di attivazione durante la ricezione di un messaggio da parte del servizio.
aspNetCompatibilityEnabled = "false" Allowed Servizio correttamente attivato.
aspNetCompatibilityEnabled = "false" NotAllowed Servizio correttamente attivato.

Nota

IIS 7.0 e WAS consentono ai servizi WCF di comunicare su protocolli diversi da HTTP. Tuttavia, i servizi WCF in esecuzione in applicazioni con la modalità di compatibilità ASP.NET attivata non sono autorizzati a esporre endpoint non HTTP. Tale configurazione genera un'eccezione di attivazione quando il servizio riceve il primo messaggio.

Per altre informazioni sull'abilitazione della modalità di compatibilità ASP.NET per i servizi WCF, vedere AspNetCompatibilityRequirementsMode e l'esempio di Compatibilità ASP.NET.

Vedi anche