Condividi tramite


Servizi WCF e ASP.NET

Questo argomento illustra l'hosting di servizi Windows Communication Foundation (WCF) insieme ad ASP.NET e il loro hosting in modalità di compatibilità con ASP.NET.

Hosting WCF e ASP.NET contemporaneamente

I servizi WCF ospitati in Internet Information Services (IIS) possono essere collocati insieme a .ASPX pagine e servizi Web ASMX all'interno di un singolo, comune dominio applicativo. ASP.NET fornisce servizi di infrastruttura comuni, ad esempio la gestione di AppDomain e la compilazione dinamica sia per WCF che per il runtime HTTP ASP.NET. La configurazione predefinita per WCF è parallela a quella di ASP.NET.

Screenshot che mostra i servizi WCF e ASP .NET: stato di condivisione.

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

I risultati del modello affiancato sono i seguenti:

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

  • I servizi WCF si comportano in modo coerente, indipendentemente dall'ambiente di hosting e dal trasporto. Il runtime HTTP ASP.NET è intenzionalmente associato all'ambiente di hosting IIS/ASP.NET e alla comunicazione HTTP. Al contrario, WCF è progettato per comportarsi in modo coerente in ambienti di hosting (WCF si comporta in modo coerente sia all'interno che all'esterno di IIS) e attraverso il trasporto (un servizio ospitato in IIS 7.0 e versioni successive ha un comportamento coerente in tutti gli endpoint esposti, anche se alcuni di questi endpoint 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 all'interno di un AppDomain che contiene ASP.NET contenuto. Di seguito sono riportati alcuni esempi di queste funzionalità:

    • HttpContext: Current è sempre null quando si accede dall'interno di 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 del servizio quando si decide se una richiesta di servizio è autorizzata.

    • Autorizzazione URL basata su configurazione: analogamente, il modello di sicurezza WCF non rispetta le regole di autorizzazione basate su URL specificate nell'elemento di configurazione dell'autorizzazione< di >System.Web. Queste impostazioni vengono ignorate per le richieste WCF se un servizio si trova in uno spazio URL protetto dalle regole di autorizzazione URL di ASP.NET.

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

    • ASP.NET impersonazione: per impostazione predefinita, le richieste WCF vengono sempre eseguite come identità del processo IIS, anche se ASP.NET è impostato per abilitare l'impersonazione usando 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 di ASP.NET non è influenzato dalla presenza di WCF.

Le applicazioni WCF che richiedono funzionalità fornite tradizionalmente dalla pipeline HTTP devono prendere in considerazione l'uso degli equivalenti WCF, che sono indipendenti dall'host e dal trasporto:

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

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

Anche se il modello WCF è progettato per comportarsi in modo coerente tra ambienti di hosting e trasporti, spesso esistono scenari in cui un'applicazione non richiede questo grado di flessibilità. La modalità di compatibilità ASP.NET wcf è adatta per scenari che non richiedono la possibilità di ospitare all'esterno di IIS o di comunicare su protocolli diversi da HTTP, ma che usano tutte le funzionalità della piattaforma di applicazioni Web ASP.NET.

A differenza della configurazione side-by-side predefinita, in cui l'infrastruttura di hosting WCF intercetta i messaggi WCF e li instrada 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 al modo in cui vengono gestite le richieste per le pagine ASPX e i servizi Web ASMX. Di conseguenza, WCF si comporta in modo identico a ASMX rispetto alle funzionalità di ASP.NET seguenti:

  • HttpContext: I servizi WCF in esecuzione nella Modalità di compatibilità ASP.NET possono accedere a Current e al suo stato associato.

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

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

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

  • ASP.NET impersonificazione: i servizi WCF vengono eseguiti usando l'identità corrente del thread impersonato di ASP.NET, che può essere diversa dall'identità del processo IIS se l'impersonificazione di ASP.NET è stata abilitata per l'applicazione. Se ASP.NET rappresentazione e rappresentazione WCF sono entrambi abilitati per una determinata operazione del servizio, l'implementazione del servizio viene eseguita usando l'identità ottenuta da WCF.

La modalità di compatibilità ASP.NET di WCF è abilitata a livello dell'applicazione tramite la seguente configurazione (disponibile nel file Web.config dell'applicazione):

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

Questo valore viene impostato su false per impostazione predefinita se non specificato. Il valore di false indica che tutti i servizi WCF in esecuzione nell'applicazione non verranno eseguiti in modalità di compatibilità ASP.NET.

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

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

La tabella seguente illustra come l'impostazione della modalità di compatibilità a livello di applicazione interagisce con il livello di supporto dichiarato del singolo servizio:

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

Impostazione
Risultato osservato
aspNetCompatibilityEnabled = "true" Required Il servizio viene attivato correttamente.
aspNetCompatibilityEnabled = "true" Allowed Il servizio viene attivato correttamente.
aspNetCompatibilityEnabled = "true" NotAllowed Si verifica un errore di attivazione quando il servizio riceve un messaggio.
aspNetCompatibilityEnabled = "false" Required Si verifica un errore di attivazione quando il servizio riceve un messaggio.
aspNetCompatibilityEnabled = "false" Allowed Il servizio viene attivato correttamente.
aspNetCompatibilityEnabled = "false" NotAllowed Il servizio viene attivato correttamente.

Annotazioni

IIS 7.0 e WAS consentono ai servizi WCF di comunicare tramite protocolli diversi da HTTP. Tuttavia, i servizi WCF in esecuzione nelle applicazioni che hanno abilitato la modalità di compatibilità ASP.NET 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 .

Vedere anche