Простой способ запустить nhibernate в проекте WCF
-
10-10-2019 - |
Вопрос
Я хотел бы использовать модуль стартапа Nhibernate для моего проекта WCF, подобный тому, который я использую для своих проектов ASP.NET MVC. Джеффри Палермо описывает модуль запуска, который я использую в его посте 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 Test Client или прямо против конечной точки с Мыло. Анкет Каковы мои варианты простого механизма запуска для Nhibernate в проекте WCF?
Решение
Вы можете решить проблему, используя Инспектор сообщений. Анкет На вашем реализации 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. Это позволит вам создать новое поведение, которое возвращает nhibernatemodule в вашем web.config.
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>