Servicios WCF y ASP.NET
En este tema se describe cómo hospedar servicios Windows Communication Foundation (WCF) en paralelo con ASP.NET y hospedarlos en ASP.NET de compatibilidad.
Hospedaje de WCF en paralelo con ASP.NET
Los servicios WCF hospedados Internet Information Services (IIS) se pueden encontrar con . Páginas ASPX y servicios web ASMX dentro de un único dominio de aplicación común. ASP.NET proporciona servicios de infraestructura comunes, como la administración de AppDomain y la compilación dinámica para WCF y ASP.NET tiempo de ejecución HTTP. La configuración predeterminada para WCF es en paralelo con ASP.NET.

El tiempo de ejecución HTTP de ASP.NET controla las solicitudes ASP.NET pero no participa en el procesamiento de solicitudes destinadas a servicios WCF, aunque estos servicios se hospedan en el mismo AppDomain que el contenido ASP.NET. En su lugar, el modelo de servicio WCF intercepta los mensajes dirigidos a los servicios WCF y los enruta a través de la pila de transporte o canal de WCF.
Los resultados del modelo en paralelo son de la siguiente manera:
ASP.NET y los servicios WCF pueden compartir el estado de AppDomain. Dado que los dos marcos pueden coexistir en el mismo AppDomain, WCF también puede compartir el estado de AppDomain con ASP.NET (incluidas variables estáticas, eventos, entre otros).
Los servicios WCF se comportan de forma coherente, independientemente del entorno de hospedaje y el transporte. El tiempo de ejecución de HTTP de ASP.NET se acopla de manera intencionada al entorno de hospedaje de IIS/ASP.NET y a la comunicación HTTP. Por el contrario, WCF está diseñado para comportarse de forma coherente en entornos de hospedaje (WCF se comporta de forma coherente dentro y fuera de IIS) y a través del transporte (un servicio hospedado en IIS 7.0 y versiones posteriores tiene un comportamiento coherente en todos los puntos de conexión que expone, incluso si algunos de esos puntos de conexión usan protocolos distintos de HTTP).
Dentro de un AppDomain, las características implementadas por el tiempo de ejecución HTTP se aplican a ASP.NET contenido, pero no a WCF. Muchas características específicas de HTTP de la plataforma ASP.NET aplicación no se aplican a los servicios WCF hospedados dentro de un AppDomain que contiene ASP.NET contenido. Ejemplos de estas características incluyen lo siguiente:
HttpContext: Current siempre se accede
nulldesde un servicio WCF. En su lugar, use RequestContext.Autorización basada en archivos: el modelo de seguridad wcf no permite la lista de control de acceso (ACL) aplicada al archivo .svc del servicio al decidir si una solicitud de servicio está autorizada.
Autorización de url basada en configuración: de forma similar, el modelo de seguridad de WCF no se adhiere a ninguna regla de autorización basada en url especificada en el elemento de configuración de autorización de System.Web<>. Esta configuración se omite para las solicitudes WCF si un servicio reside en un espacio de direcciones URL protegido por las ASP.NET de autorización de direcciones URL de la aplicación.
Extensibilidad de HttpModule: la infraestructura de hospedaje de WCF intercepta las solicitudes WCF PostAuthenticateRequest cuando se genera el evento y no devuelve el procesamiento a la ASP.NET http. Los módulos que están codificados para interceptar solicitudes en fases posteriores de la canalización no interceptan las solicitudes WCF.
ASP.NET suplantación: de forma predeterminada, las solicitudes WCF siempre se ejecuta como la identidad de proceso de IIS, incluso si ASP.NET está establecido para habilitar la suplantación mediante la opción de configuración impersonate="true" de> identidad de System.Web<.
Estas restricciones solo se aplican a los servicios WCF hospedados en la aplicación IIS. El comportamiento de ASP.NET contenido no se ve afectado por la presencia de WCF.
Las aplicaciones WCF que requieren la funcionalidad tradicionalmente proporcionada por la canalización HTTP deben considerar el uso de los equivalentes de WCF, que son independientes del host y del transporte:
OperationContext en lugar de HttpContext.
ServiceAuthorizationBehavior en lugar de la autorización de archivo/URL de ASP.NET.
IDispatchMessageInspector o los canales dispuestos en capas personalizados en lugar de los módulos HTTP.
Suplantación para cada operación mediante WCF en lugar de suplantación de System.Web.
Como alternativa, puede considerar la posibilidad de ejecutar los servicios en el modo de compatibilidad de ASP.NET WCF.
Hospedaje de servicios WCF en ASP.NET de compatibilidad
Aunque el modelo WCF está diseñado para comportarse de forma coherente en los entornos de hospedaje y los transportes, a menudo hay escenarios en los que una aplicación no requiere este grado de flexibilidad. El modo de compatibilidad ASP.NET de WCF es adecuado para escenarios que no requieren la capacidad de hospedarse fuera de IIS o de comunicarse a través de protocolos distintos de HTTP, pero que usan todas las características de la plataforma de aplicaciones web ASP.NET.
A diferencia de la configuración en paralelo predeterminada, donde la infraestructura de hospedaje de WCF intercepta los mensajes WCF y los enruta fuera de la canalización HTTP, los servicios WCF que se ejecutan en modo de compatibilidad de ASP.NET participan completamente en el ciclo de vida de la solicitud HTTP de ASP.NET. En modo de compatibilidad, los servicios WCF usan la canalización HTTP IHttpHandler a través de una implementación, similar a la manera en que se controlan las solicitudes de páginas ASPX y servicios web ASMX. Como resultado, WCF se comporta de forma idéntica a ASMX con respecto a las siguientes ASP.NET características:
HttpContext: los servicios WCF que se ASP.NET modo de compatibilidad pueden tener acceso a Current y su estado asociado.
Autorización basada en archivos: los servicios WCF que se ejecutan en modo de compatibilidad de ASP.NET pueden ser seguros adjuntando listas de control de acceso (ACL) del sistema de archivos al archivo .svc del servicio.
Autorización de direcciones URL configurables: ASP.NET reglas de autorización de direcciones URL de las solicitudes WCF cuando el servicio WCF se ejecuta ASP.NET modo de compatibilidad.
HttpModuleCollectionextensibilidad: dado que los servicios WCF que se ejecutan en el modo de compatibilidad de ASP.NET participan completamente en el ciclo de vida de la solicitud HTTP de ASP.NET, cualquier módulo HTTP configurado en la canalización HTTP puede funcionar en solicitudes WCF antes y después de la invocación del servicio.
ASP.NET suplantación: los servicios WCF se ejecutan con la identidad actual del subproceso suplantado de ASP.NET, que puede ser diferente de la identidad de proceso de IIS si se ha habilitado la suplantación de ASP.NET para la aplicación. Si ASP.NET y la suplantación de WCF están habilitadas para una operación de servicio determinada, la implementación del servicio se ejecuta en última instancia mediante la identidad obtenida de WCF.
El modo de compatibilidad ASP.NET de wcf está habilitado en el nivel de aplicación mediante la configuración siguiente (que se encuentra en el archivo de Web.config de la aplicación):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Este valor tiene como valor predeterminado false si no se especifica. El valor de false indica que todos los servicios WCF que se ejecutan en la aplicación no se ejecutarán en ASP.NET modo de compatibilidad.
Dado ASP.NET modo de compatibilidad implica semántica de procesamiento de solicitudes que es fundamentalmente diferente del valor predeterminado de WCF, las implementaciones de servicio individuales tienen la capacidad de controlar si se ejecutan dentro de una aplicación para la que se ha habilitado ASP.NET Modo de compatibilidad de ASP.NET. Los servicios pueden utilizar el AspNetCompatibilityRequirementsAttribute para indicar si admiten el modo de compatibilidad de ASP.NET. El valor predeterminado para este atributo es Allowed.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}
La siguiente tabla muestra cómo el valor del modo de compatibilidad de toda la aplicación interactúa con el nivel expresado de compatibilidad del servicio individual:
| Valor de modo de compatibilidad de la aplicación | [AspNetCompatibilityRequirementsMode] Opción |
Resultado observado |
|---|---|---|
aspNetCompatibilityEnabled = "true" |
Required | El servicio se activa correctamente. |
aspNetCompatibilityEnabled = "true" |
Allowed | El servicio se activa correctamente. |
aspNetCompatibilityEnabled = "true" |
NotAllowed | Se produce un error de activación cuando el servicio recibe un mensaje. |
aspNetCompatibilityEnabled = "false" |
Required | Se produce un error de activación cuando el servicio recibe un mensaje. |
aspNetCompatibilityEnabled = "false" |
Allowed | El servicio se activa correctamente. |
aspNetCompatibilityEnabled = "false" |
NotAllowed | El servicio se activa correctamente. |
Nota
IIS 7.0 y WAS permiten que los servicios WCF se comuniquen a través de protocolos distintos de HTTP. Sin embargo, los servicios WCF que se ejecutan en aplicaciones que ASP.NET modo de compatibilidad no pueden exponer puntos de conexión no HTTP. Este tipo de configuración genera una excepción de activación cuando el servicio recibe su primer mensaje.
Para obtener más información sobre cómo habilitar ASP.NET modo de compatibilidad para los servicios WCF, vea AspNetCompatibilityRequirementsMode y el ejemplo AspNetCompatibilityRequirementsMode.