Pregunta

Me gustaría usar un módulo de inicio de NHibernate para mi proyecto WCF como el uso que yo para mis proyectos ASP.NET MVC. Jeffery Palermo describe el módulo de inicio que utilizo en su puesto ASP.NET MVC HttpModule registro . En esencia, el código se reduce a la adición de un módulo de arranque en el web.config que es similar al siguiente:

 <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 cliente de prueba WCF o directamente contra el punto final con SoapUI . ¿Cuáles son mis opciones para un mecanismo de arranque simple para NHibernate en un proyecto WCF?

¿Fue útil?

Solución

Se puede resolver el problema mediante el uso de un mensaje inspector . En su NHibernateModule aplicar IDispatchMessageInspector . Esto le permitirá abrir la sesión de NHibernate que cada solicitud se recibe y se cierra justo antes de su respuesta se envía.

demostración de Palermo indica que va a tener IHttpModule extendida. 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 tendrá que poner en práctica el IServiceBehavior interfaz . Esto le permitirá utilizar 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 añadirá el nuevo inspector para cada uno de los puntos finales.

A continuación, tendrá que añadir un BehaviorExtensionElement . Este BehaviorExtensionElement debe devolver el tipo y una nueva instancia de su NHibernateModule. Esto le permitirá crear un nuevo comportamiento que devuelve 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 usted tiene todas las piezas en orden, se puede utilizar en su web.config. Para aplicarlos a todos los servicios que su web.config debe ser similar al siguiente.

<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top