Замок WCF | Хостинг службы Windows

Я пытаюсь использовать средство интеграции Castle WCF в своем проекте WCF, но заблудился на этом пути. Не могли бы вы мне помочь?

Итак, вот ситуация:

У меня есть библиотека службы WCF, которая размещена внутри службы Windows через TCP. Вот что находится в моей библиотеке сервисов WCF: Service Impl:

[ServiceContract]
    public interface ICalculatorService
    {
        [OperationContract]
        int Add(int x, int y);
    }

    public class CalculatorService : ICalculatorService
    {
        public int Add(int x, int y)
        {
            return x + y;
        }
    }

Конфигурация:

 <system.serviceModel>
    <services>
      <service name="namespace.CalculatorService">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration=""
          contract="namespace.iCalculatorService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/CalculatorService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Конфигурация контейнера Это внутри проекта WCF, где я зарегистрировал все для блокировки (я не уверен, где должно быть зарегистрировано средство wcf, должно ли оно быть зарегистрировано из службы WCF или из службы Windows, на которой размещены служба WCF).

 public class ConfigureContainerCastle
    {
        private readonly IWindsorContainer container;

        public ConfigureContainerCastle(IWindsorContainer container)
        {
            this.container = container;
        }

        public void Configure()
        {
            // Any component registration.
            container.Register(Component.For<ICalculatorService>().ImplementedBy<CalculatorService>());
            //All other component registration.
        }
    }

Вот что находится в моей службе Windows:

 public class Host<T>:ServiceBase
    {
     private ServiceHost serviceHost = null;
            protected override void OnStart(string[] args)
            {
                if (serviceHost != null)
                {
                    serviceHost.Close();
                }

                // How do I call the DefaultServiceHostFactory and start the service?
                // Should I call the WCF facility from here or from WCF service library?
//                var container = new WindsorContainer();
  //              var configureContainer = new DataServicesConfigureContainer(container);
    //            var hostFactory = new DefaultServiceHostFactory(container.Kernel);

                serviceHost = new ServiceHost(typeof (T));
                serviceHost.Open();
            }

            protected override void OnStop()
            {
                if (serviceHost == null)
                    return;

                serviceHost.Close();
                serviceHost = null;
            }
    }

И моя конфигурация (app.config) для службы Windows такая же, как и моя служба WCF, буквально построчно.

Теперь вопрос в том, как связать все это вместе с помощью WCF? Я видел много примеров использования http и global.asax, но ни одного для служб Windows. Не могли бы вы помочь? Даже соответствующая ссылка на него будет полезна.

Спасибо, -Майк


person Mike    schedule 28.05.2012    source источник


Ответы (1)


Прежде всего небольшой момент - если вы хотите TCP, вам нужно указать базовый адрес с использованием протокола net.tcp следующим образом:

<add baseAddress="net.tcp://localhost:8732/CalculatorService" />

Но это не твой вопрос, так что сокрушительно...

(Я не уверен, где должно быть зарегистрировано средство wcf, должно ли оно быть зарегистрировано из службы WCF или из службы Windows, на которой размещена служба WCF).

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

Теперь вопрос в том, как связать все это вместе с помощью WCF? Я видел много примеров использования http и global.asax, но ни одного для служб Windows. Не могли бы вы помочь? Даже соответствующая ссылка на него будет полезна.

На самом деле довольно просто - если вы хотите сохранить свою конфигурацию в файле конфигурации, вы можете просто изменить свой метод Configure следующим образом (я предполагаю, что у вас уже есть ссылка на Castle.Facilities.WcfIntegration):

public void Configure()
{
    container.AddFacility<WcfFacility>();

    // Any component registration.
    container.Register(Component
        .For<ICalculatorService>()
        .ImplementedBy<CalculatorService>()
        .AsWcfService());

    //All other component registration.
}

И это все — теперь Windsor отвечает за обслуживание сервиса, когда к нему подключается клиент WCF (не верите мне — добавьте несколько зависимостей в свой CalculatorService и удивитесь чуду).

Возможно, вам захочется полностью отказаться от конфигурационного файла и вместо этого использовать Windsor Fluent API — он довольно интуитивно понятен, просто взгляните на то, что вы можете передать в метод AsWcfService, и все готово (или просто придерживайтесь конфигурационного файла ).

person kmp    schedule 04.07.2012