Question

Je voudrais utiliser le module d'un NHibernate pour mon projet de WCF comme celui que je utiliser pour mes projets ASP.NET MVC. Jeffery Palerme décrit le module de démarrage que j'utilise dans son poste ASP.NET MVC HttpModule d'enregistrement. Essentiellement le code se résume à l'ajout d'un module de démarrage dans le web.config qui ressemble à ceci:

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

Ce ne fonctionne pas lorsque je tente d'exécuter le service avec le client test WCF ou directement sur le point final avec SoapUI . Quelles sont mes options pour un mécanisme simple de démarrage pour NHibernate dans un projet WCF?

Était-ce utile?

La solution

Vous pouvez résoudre le problème en utilisant un message Inspecteur . Sur votre NHibernateModule mettre en œuvre IDispatchMessageInspector . Cela vous permettra d'ouvrir votre session NHibernate que chaque demande est reçue et fermez juste avant votre réponse est envoyée.

La démo de Palerme indique que vous aurez IHttpModule étendu. Si tel est le cas, vous allez ajouter deux méthodes pour l'interface IDispatchMessageInspector:

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

et

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

mettra en œuvre la nouvelle interface en utilisant votre ancien code. Vous devrez également mettre en œuvre le IServiceBehavior Interface . Cela vous permettra d'utiliser le module sur une extension de comportement dans votre web.config. Le IServiceBehavior exige trois méthodes, une seule ne fait quoi que ce soit:

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

Cela va ajouter votre nouvel inspecteur à chacun des points d'extrémité.

Vous devrez alors ajouter un BehaviorExtensionElement . Ce BehaviorExtensionElement doit retourner le type et une nouvelle instance de votre NHibernateModule. Cela vous permettra de créer un nouveau comportement qui retourne le NHibernateModule dans votre web.config.

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

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

Maintenant que vous avez toutes les pièces dans l'ordre, vous pouvez les utiliser dans votre web.config. Pour les appliquer à tous les services de votre web.config devrait ressembler à ce qui suit.

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top