Frage

Ich möchte ein NHibernate Startmodul für meine WCF-Projekt, wie ich sie verwenden, um für meine ASP.NET MVC-Projekte. Jeffery Palermo skizziert das Startmodul, dass ich in seinem Beitrag mit ASP.NET MVC Httpmodule Registrierung . Im Wesentlichen läuft darauf hinaus der Code zum Hinzufügen eines Startmodul in der web.config nach unten, dass sieht wie folgt aus:

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

Das funktioniert nicht, wenn ich versuche, den Dienst mit dem WCF Test Client ausführen oder direkt gegen den Endpunkt mit SoapUI . Was sind meine Optionen für eine einfache Inbetriebnahme Mechanismus für NHibernate in einem WCF-Projekt?

War es hilfreich?

Lösung

Sie können das Problem beheben, indem Sie einen Nachricht Inspector . Auf Ihrer NHibernateModule implementieren IDispatchMessageInspector . Dies ermöglicht Ihnen, Ihre NHibernate Sitzung zu öffnen, da jede Anforderung empfangen wird, und schließen Sie es direkt vor Ihrer Antwort wird aus gesendet wird.

Palermo Demo zeigt an, dass Sie erweiterte IHttpModule haben. Wenn das der Fall ist, werden Sie zwei Methoden zur IDispatchMessageInspector Schnittstelle hinzufügen:

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

und

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

Dies wird die neue Schnittstelle mit Ihrem alten Code implementieren. Sie werden auch die IServiceBehavior Schnittstelle implementieren müssen . Auf diese Weise können Sie das Modul auf einem Verhalten Erweiterung in Ihrer web.config verwenden. Die IServiceBehavior erfordert drei Methoden, nur wird man wirklich etwas tun:

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

Dies wird Ihren neuen Inspektoren an jeden der Endpunkte hinzuzufügen.

Sie werden dann hinzuzufügen, haben eine BehaviorExtensionElement . Diese BehaviorExtensionElement sollte die Art und eine neue Instanz Ihrer NHibernateModule zurückzukehren. Dies ermöglicht es Ihnen, ein neues Verhalten, dass die Rendite der NHibernateModule in Ihrem web.config zu erstellen.

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

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

Jetzt können Sie die Stücke alle in Ordnung haben, können Sie sie in Ihrem web.config verwenden. So wenden sie auf alle Dienste Ihrer web.config wie folgt aussehen sollte.

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top