2010-12-15 11 views
5

Me gustaría utilizar un módulo de inicio NHibernate para mi proyecto WCF como el que uso para mis proyectos ASP.NET MVC. Jeffery Palermo describe el módulo de inicio que uso en su publicación ASP.NET MVC HttpModule Registration. En esencia, el código se reduce a la adición de un módulo de arranque en el web.config que tiene este aspecto:Manera fácil de iniciar NHibernate en un proyecto WCF

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="StartupModule" type="Infrastructure.NHibernateModule, Infrastructure, Version=1.0.0.0, Culture=neutral" /> 
    </modules> 
    </system.webServer> 

Esto no está funcionando cuando trato de ejecutar el servicio con la WCF Test Client o directamente en contra del criterio de valoración con SoapUI. ¿Cuáles son mis opciones para un mecanismo de inicio simple para NHibernate en un proyecto de WCF?

Respuesta

6

Puede resolver el problema mediante el uso de un Message Inspector. En su NHibernateModule, implemente IDispatchMessageInspector. Esto le permitirá abrir su sesión de NHibernate a medida que se reciba cada solicitud y cerrarla justo antes de que se envíe su respuesta.

La demostración de Palermo indica que habrá extendido IHttpModule. Si ese es el caso, se le agrega dos métodos para la interfaz IDispatchMessageInspector:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
{ 
    context_BeginRequest(null, null); 
    return null; 
} 

y

public void BeforeSendReply(ref Message reply, object correlationState) 
{ 
    context_EndRequest(null, null); 
} 

Esto pondrá en marcha la nueva interfaz usando el código antiguo. También necesitará implementar la interfaz IServiceBehavior. Esto le permitirá usar el módulo en una extensión de comportamiento en su web.config. El IServiceBehavior requiere tres métodos, sólo uno realmente va a hacer nada:

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
{ 
    foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers) 
    { 
     foreach (EndpointDispatcher ed in cd.Endpoints) 
     { 
      ed.DispatchRuntime.MessageInspectors.Add(this); 
     } 
    } 
} 

Esto agregará su nuevo inspector para cada uno de los puntos finales.

A continuación, tendrá que agregar un BehaviorExtensionElement. Este BehaviorExtensionElement debe devolver el tipo y una nueva instancia de su NHibernateModule. Esto le permitirá crear un nuevo comportamiento que devuelva el NHibernateModule en su web.config.

public class NHibernateWcfBehaviorExtension : BehaviorExtensionElement 
{ 
    public override Type BehaviorType 
    { 
     get { return typeof(NHibernateModule); } 
    } 

    protected override object CreateBehavior() 
    { 
     return new NHibernateModule(); 
    } 
} 

Ahora que tiene todas las piezas en orden, puede usarlas en su web.config. Para aplicarlos a todos los servicios, su web.config debería verse de la siguiente manera.

<system.serviceModel> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="true"/> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     <NHibernateSessionStarter /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <extensions> 
    <behaviorExtensions> 
     <add name="NHibernateSessionStarter" type="Infrastructure.NHibernateWcfBehaviorExtension, Infrastructure, Version=1.0.0.0, Culture=neutral" /> 
    </behaviorExtensions> 
    </extensions> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 
Cuestiones relacionadas