【问题标题】:Castle WCF Facility | Windows Service Hosting城堡 WCF 设施 | Windows 服务托管
【发布时间】:2012-06-03 02:09:03
【问题描述】:

我尝试在我的 WCF 项目中使用 Castle WCF 集成工具,但在路上迷路了。你能帮帮我吗?

所以,情况如下:

我有一个 WCF 服务库,它通过 TCP 托管在 Windows 服务中。 以下是我的 WCF 服务库中的内容: 服务实现:

[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;
            }
    }

我的 Windows 服务配置 (app.config) 与我的 WCF 服务相同,逐行逐行。

现在的问题是,我如何将这一切与 WCF 设施连接在一起?我见过很多使用 http 和 global.asax 的例子,但没有一个用于 Windows 服务的例子。你能帮忙吗?即使是适当的链接也会有所帮助。

谢谢, -迈克

【问题讨论】:

    标签: c# wcf c#-4.0 castle-windsor wcffacility


    【解决方案1】:

    首先是一个小点——如果你想要 TCP,你需要使用net.tcp 协议指定基地址,如下所示:

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

    但那不是你的问题,所以迷恋......

    (我不确定 wcf 工具应该在哪里注册,是应该从 WCF 服务注册还是从托管 WCF 服务的 Windows 服务注册)。

    我建议您在靠近您注册服务的地方注册该设施。所以,在 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 方法,然后就可以离开(或者坚持使用配置文件)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多