Вопрос

Я хотел бы использовать модуль стартапа 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top