Не могу получить расширение WCF, чтобы зарегистрироваться - PullRequest
0 голосов
/ 21 июня 2011

Я довольно новичок в wcf и пытаюсь получить расширение wcf для регистрации, поэтому могу ультимативно открывать / закрывать сеанс NHibernate.

Однако я следовал за подробностями в Блог Адама Матусиакса1004 *.Я должен был сделать несколько предположений, поскольку это не компилировалось в первый раз.(NHibernateEndpointExtension: IExtension, это наследование не имеет типа в примере).Это просто не зарегистрирует расширение.Когда я делаю вызов wcf, он не имеет расширений в коллекции.

Нет сообщений об ошибках, и я не вижу ничего в журналах, которые я вижу

Кто-нибудь знает, где я могу посмотреть на некоторые записи или что-то в этом роде. Мой web.config выглядит следующим образом

  <system.serviceModel>
    <extensions>
      <behaviorExtensions>
        <add name="NHibernateExtension" type="SMS.Infrastructure.NHibernateEndpointExtension, SMS.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </behaviorExtensions>
    </extensions>
    <bindings>
      <basicHttpBinding>
        <binding name="AmjBasicHttpEndpointBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
      <wsHttpBinding>
        <binding name="AmjWsBinding">
          <security>
            <transport proxyCredentialType="Windows" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SMS.Services.BEIMBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <!-- set thsi to false if you dont want helpfult stack traces-->
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="SMS.Services.BEIMBehavior" name="SMS.Services.BEIM">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="AmjWsBinding"
          name="BeimServices" contract="SMS.Services.IBEIM">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

  </system.serviceModel>

Классы, которые я использую, следующие: на данный момент я избавился от вещей nhibernate, поскольку могу справиться с этим, когда расширение зарегистрировано

namespace SMS.Infrastructure
{

    public class NHibernateEndpointExtension : IExtension<OperationContext>
    {
        public NHibernateEndpointExtension()
        {
        }

        public NHibernate.ISession NHibernateSession{ get; set; }
        public void Attach(OperationContext owner)
        {
        }

        public void Detach(OperationContext owner)
        {
        }
    }



    public class NHibernateEndpointContextInitializer : ICallContextInitializer
    {
        public object BeforeInvoke(InstanceContext instanceContext, IClientChannel channel, Message message)
        {
            bool found = false;
            foreach (IExtension<OperationContext> extension in OperationContext.Current.Extensions)
            {
                if (extension is NHibernateEndpointExtension)
                {
                    found = true;
                    break;
                }
            }
            if (!found)
            {
                OperationContext.Current.Extensions.Add(new NHibernateEndpointExtension());
            }
            return NHibernateWcfSessionProvider.Instance.OpenSession();

        }

        public void AfterInvoke(object correlationState)
        {
            NHibernateWcfSessionProvider.Instance.CloseSession(((NHibernate.ISession)correlationState));
            ((IDisposable)correlationState).Dispose();

        }
    }

    public class NHibernateEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior

    {

        public override Type BehaviorType
        {
            get { return typeof(NHibernateEndpointBehavior); }
        }

        protected override object CreateBehavior()
        {
            return new NHibernateEndpointBehavior();
        }

        public void Validate(ServiceEndpoint endpoint)
        {
        }

        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint,
            EndpointDispatcher endpointDispatcher)
        {
            foreach (DispatchOperation operation in endpointDispatcher.DispatchRuntime.Operations)
            {
                operation.CallContextInitializers.Add(new NHibernateEndpointContextInitializer());
            }
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
        }
    }


    public class NHibernateWcfSessionProvider
    {

        public NHibernateWcfSessionProvider()
        {

        }

        private static NHibernateWcfSessionProvider instance;

        public static NHibernateWcfSessionProvider Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new NHibernateWcfSessionProvider();
                }
                return instance;
            }
        }

        private ISessionFactory sessionFactory;

        public void CreateSessionFactory()
        {
            sessionFactory= NHibernateHelper.CreateSessionFactory();
        }

        public NHibernate.ISession GetSession()
        {
            // get Nhibernate session from OperationContext or HttpContext
            return ISession // just here to show that a session will be returned
        }

        public NHibernate.ISession OpenSession()
        {
            // get Nhibernate session from OperationContext or HttpContext
            return ISession // just here to show that a session will be returned
        }

        public void CloseSession()
        {
            CloseSession(null);
        }

        public void CloseSession(NHibernate.ISession session)
        {
            ///Closes NHibernate session cleanly
         }

    }

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Я действительно не пытался выполнить это, поэтому может быть больше проблем, чем показано ниже, пожалуйста, потерпите меня.

Похоже, вы зарегистрировали только расширение поведения (используя элемент system.serviceModel\extensions\behaviorExtensions\add).Вам также необходимо добавить его в конфигурацию привязки, добавив соответствующий элемент (по имени, указанному вами при регистрации).В вашем случае это должно быть:

<behaviors>
  <serviceBehaviors>
  ...
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="MyEpBehavior">
      <!-- ... possibly other stuff ... -->
      <NHibernateExtension/>
    </behavior>
  </endpointBehaviors>
</behaviors>
<services>
  <service behaviorConfiguration="SMS.Services.BEIMBehavior" name="SMS.Services.BEIM">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="AmjWsBinding"
      name="BeimServices" contract="SMS.Services.IBEIM"
      configuration="MyEpBehavior"> <!-- SET ENDPOINT BEHAVIOR -->
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

Из вашего вопроса не ясно, пытались ли вы, но при устранении неполадок в механике WCF обычно весьма полезно включить трассировка WCF хотя я не уверен, стоит ли говорить что-либо об этой конкретной проблеме.

0 голосов
/ 22 июня 2011

Получилось, у меня было расширение поведения, указывающее на неправильный класс, был NHibernateEndpointExtension, но это должно было быть NHibernateEndpointBehavior. И затем все это прорезается. Я бы порекомендовал любому другому использовать диспетчер конфигурации службы WCF (меню Сервис VS2010)

Окончательный web.config выглядит следующим образом

  <system.serviceModel>
    <extensions>
      <behaviorExtensions>
        <add name="NHibernateExtension" type="SMS.Infrastructure.NHibernateEndpointBehavior, SMS.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </behaviorExtensions>
    </extensions>
    <bindings>
      <basicHttpBinding>
        <binding name="AmjBasicHttpEndpointBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
      <wsHttpBinding>
        <binding name="AmjWsBinding">
          <security>
            <transport proxyCredentialType="Windows" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="NHibernateBehavior">
          <NHibernateExtension />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="SMS.Services.BEIMBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="SMS.Services.BEIMBehavior" name="SMS.Services.BEIM">

        <endpoint address="" behaviorConfiguration="NHibernateBehavior"
          binding="wsHttpBinding" bindingConfiguration="AmjWsBinding"
          name="BeimServices" contract="SMS.Services.IBEIM">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

  </system.serviceModel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...