我想将NHIBERNATE启动模块用于我的WCF项目,例如我用于ASP.NET MVC项目的项目。杰弗里·巴勒莫(Jeffery Palermo)概述了我在他的帖子中使用的启动模块 ASP.NET MVC HTTPMODULE注册. 。本质上,代码归结为在Web.config中添加一个启动模块,该模块看起来像这样:

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

当我尝试与 WCF测试客户端 或直接与端点有关 肥皂. 。在WCF项目中,我可以选择简单的NHIBERNATE启动机制?

有帮助吗?

解决方案

您可以使用 消息检查员. 。在您的NHIBERNATEMODULE上 idisPatchMessageInspector. 。这将使您可以在收到每个请求时打开NHIBERNATE会话,并在收到答复之前将其关闭。

Palermo的演示表明您将扩展IHTTPMODULE。如果是这种情况,您将为IDISPATCHMESSAGEINSPECTOR接口添加两种方法:

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

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

这将使用您的旧代码实现新界面。您还需要实施 Iservicebehavior 界面。这将使您可以在Web.config中的行为扩展上使用模块。 IserviceBehavior需要三种方法,只有一种实际上会做任何事情:

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

这将使您的新检查员添加到每个端点。

然后,您将不得不添加一个 行为. 。此行为应返回NHIBERNATEMODULE的类型和新实例。这将允许您创建一种新的行为,该行为返回Web.config中的NHIBERNATEMODULE。

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

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

现在,您可以按顺序进行所有内容,可以在Web.config中使用它们。将它们应用于您的Web.config的所有服务,应该看起来像以下内容。

<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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top