wcf - 在 WCF 项目中启动 NHibernate 的简单方法

标签 wcf nhibernate wcf-configuration

我想为我的 WCF 项目使用 NHibernate 启动模块,就像我用于 ASP.NET MVC 项目的那个一样。 Jeffery Palermo 概述了我在他的帖子 ASP.NET MVC HttpModule Registration 中使用的启动模块.本质上,代码归结为在 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 Test Client 运行服务时,这不起作用或使用 SoapUI 直接针对端点.对于 WCF 项目中 NHibernate 的简单启动机制,我有哪些选择?

最佳答案

您可以通过使用 Message Inspector 来解决此问题。 .在您的 NHibernateModule 上实现 IDispatchMessageInspector .这将允许您在收到每个请求时打开您的 NHibernate session ,并在发送回复之前关闭它。

Palermo 的演示表明您将扩展 IHttpModule。如果是这种情况,您将为 IDispatchMessageInspector 接口(interface)添加两个方法:

 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);
}

这将使用您的旧代码实现新接口(interface)。您还需要实现 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);
        }
    }
}

这会将您的新检查器添加到每个端点。

然后您必须添加 BehaviorExtensionElement .此 BehaviorExtensionElement 应返回 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>

关于wcf - 在 WCF 项目中启动 NHibernate 的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4456010/

相关文章:

android - 使用 Azure 数据库的 Android Azure 移动服务

c# - 在 NHibernate 中修改 SQL

c# - Nhibernate 多列延迟加载

c# - App.config 之外的 WCF ChannelFactory 配置?

VS Dev 服务器中托管的 WCF 服务可以正常工作,但在 IIS 中则不然

c# - 将应用程序配置嵌入到 wcf 中的 c# 代码中

c# - 从 jquery/javascript 调用 Windows 服务 wcf 服务

c# - Linq-to-SQL 和 WCF 服务 - 数据传输对象

wcf - 如何处理 Http Error 405 Method Not Allowed?

nhibernate - 在哪里下载 NHibernate CaSTLe 工具?