我想为我的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的简单启动机制有什么选择?
答案 0 :(得分:6)
您可以使用Message Inspector解决问题。在您的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);
}
}
}
这会将新检查器添加到每个端点。
然后您必须添加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>