Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describe cómo hospedar servicios de Windows Communication Foundation (WCF) en paralelo con ASP.NET y hospedarlos en modo de compatibilidad de ASP.NET.
Hospedaje de WCF en paralelo con ASP.NET
Los servicios WCF hospedados en 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 el entorno de ejecución HTTP de ASP.NET. La configuración predeterminada de WCF está en paralelo con ASP.NET.
El entorno de ejecución HTTP de ASP.NET maneja las solicitudes de ASP.NET, pero no participa en el procesamiento de solicitudes destinadas a los servicios WCF, aunque estos servicios se hospeden en el mismo AppDomain que el contenido de 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 canales y transporte de WCF.
Los resultados del modelo en paralelo son los siguientes:
ASP.NET y los servicios WCF pueden compartir el estado AppDomain. Dado que los dos marcos pueden coexistir en el mismo AppDomain, WCF también puede compartir el estado AppDomain con ASP.NET (incluidas variables estáticas, eventos, etc.).
Los servicios WCF se comportan de forma coherente, independientemente del entorno de hospedaje y el transporte. El entorno de ejecución http de ASP.NET está acoplado intencionadamente al entorno de hospedaje 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 tanto dentro como fuera de IIS) y en el 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 appDomain, las características implementadas por el entorno de ejecución HTTP se aplican a ASP.NET contenido, pero no a WCF. Muchas características específicas de HTTP de la plataforma de aplicaciones de ASP.NET no se aplican a los servicios WCF hospedados dentro de un appDomain que contiene ASP.NET contenido. Entre los ejemplos de estas características se incluyen los siguientes:
HttpContext: Current es siempre
null
cuando se accede desde 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 se autoriza una solicitud de servicio.
Autorización de dirección URL basada en configuración: de forma similar, el modelo de seguridad de WCF no cumple las reglas de autorización basadas en direcciones URL especificadas 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 reglas de autorización de direcciones URL de ASP.NET.
Extensibilidad de HttpModule: la infraestructura de hospedaje de WCF intercepta las solicitudes WCF cuando se genera el PostAuthenticateRequest evento y no devuelve el procesamiento a la canalización HTTP de ASP.NET. Los módulos que están codificados para interceptar las solicitudes en las fases posteriores de la canalización no interceptan las solicitudes WCF.
Suplantación de ASP.NET: de manera predeterminada, las solicitudes de WCF siempre se ejecutan con la identidad de proceso de IIS, aun cuando ASP.NET se configura para permitir la suplantación mediante la opción de configuración <identity impersonate=”true” /> 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 funcionalidad proporcionada tradicionalmente por la canalización HTTP deben considerar el uso de los equivalentes de WCF, que son independientes del host y el transporte:
OperationContext en lugar de HttpContext.
ServiceAuthorizationBehavior en lugar de la autorización de archivo/URL de ASP.NET.
IDispatchMessageInspector o canales personalizados con capas como alternativa a los módulos HTTP.
Suplantación para cada operación utilizando WCF en lugar de la suplantación de System.Web.
Como alternativa, puede considerar la posibilidad de ejecutar los servicios en el modo de compatibilidad ASP.NET de WCF.
Hospedaje de servicios WCF en modo de compatibilidad de ASP.NET
Aunque el modelo WCF está diseñado para comportarse de forma coherente en entornos y transportes de hospedaje, a menudo hay escenarios en los que una aplicación no requiere este grado de flexibilidad. El modo de compatibilidad de ASP.NET de WCF es adecuado para escenarios que no requieren la capacidad de hospedar fuera de IIS o comunicarse a través de protocolos distintos de HTTP, pero que usan todas las características de la plataforma de aplicaciones web de ASP.NET.
A diferencia de la configuración predeterminada en paralelo, 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 ASP.NET modo de compatibilidad participan plenamente en el ciclo de vida de la solicitud HTTP de ASP.NET. En el modo de compatibilidad, los servicios WCF utilizan la canalización HTTP a través de una IHttpHandler implementación, de manera similar a cómo se gestionan 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 características de ASP.NET:
HttpContext: Los servicios WCF que se ejecutan en Modo de Compatibilidad de ASP.NET pueden acceder a Current y su estado asociado.
Autorización basada en archivos: los servicios WCF que se ejecutan en ASP.NET modo de compatibilidad pueden protegerse mediante la asociación de listas de control de acceso (ACL) del sistema de archivos al archivo .svc del servicio.
Autorización de dirección URL configurable: las reglas de autorización de direcciones URL de ASP.NET se aplican para las solicitudes WCF cuando el servicio WCF se ejecuta en modo de compatibilidad de ASP.NET.
HttpModuleCollection extensibilidad: dado que los servicios WCF que se ejecutan en ASP.NET modo de compatibilidad participan plenamente en el ciclo de vida de la solicitud HTTP de ASP.NET, cualquier módulo HTTP configurado en la canalización HTTP puede operar en solicitudes WCF tanto antes como después de la invocación del servicio.
ASP.NET Suplantación: Los servicios WCF se ejecutan utilizando la identidad actual del hilo suplantado de ASP.NET, la cual puede ser diferente de la identidad del proceso de IIS si se ha habilitado la Suplantación de ASP.NET para la aplicación. Si la suplantación de identidad de ASP.NET y la suplantación de identidad 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 WCF está habilitado en el nivel de aplicación a través de la siguiente configuración (ubicada en el archivo Web.config de la aplicación):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Este valor tiene false
como valor predeterminado 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 que ASP.NET modo de compatibilidad implica la semántica de procesamiento de solicitudes que son fundamentalmente diferentes de la predeterminada 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. Los servicios pueden usar AspNetCompatibilityRequirementsAttribute para indicar si admiten ASP.NET modo de compatibilidad. El valor predeterminado de este atributo es Allowed.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}
En la tabla siguiente se muestra cómo interactúa la configuración del modo de compatibilidad para toda la aplicación con el nivel de soporte técnico indicado del servicio individual:
Configuración del modo de compatibilidad para toda la aplicación | [AspNetCompatibilityRequirementsMode] Configuració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 a los servicios WCF comunicarse a través de protocolos distintos de HTTP. Sin embargo, los servicios WCF que se ejecutan en aplicaciones que han habilitado ASP.NET modo de compatibilidad no pueden exponer puntos de conexión no HTTP. Esta 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, consulte AspNetCompatibilityRequirementsMode y el ejemplo de compatibilidad de ASP.NET .