您可以通過使用Message Inspector解決問題。在你的NHibernateModule實現IDispatchMessageInspector。這將允許您在收到每個請求時打開NHibernate會話,並在發送回覆之前關閉它。
巴勒莫的演示表明您將擴展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>