【问题标题】:WCF Service Library hosted as a Windows Service using Castle.Windsor 3.0 issue使用 Castle.Windsor 3.0 问题作为 Windows 服务托管的 WCF 服务库
【发布时间】:2012-04-08 16:58:07
【问题描述】:

我想在 Windows 服务中托管我的 WCF 服务库。虽然它将通过本地网络与另一个 wcfservice 通信。

我很难找到最新的文档或为此目的配置解决方案的帮助。任何人都可以建议:

a) 这种连接的首选端点是什么? (另一个 WCF 服务使用 basicHttpBinding 托管)——这本身很适合通过劫持 global.asax 来配置 Castle 容器。但是,将此解决方案托管在 Windows 服务中意味着我不再可以访问 global.asax!

b) 如何配置 Castle Windsor 以在此解决方案中使用 DI?目前我已经研究了将它与 App_Code 的 AppInitilize() 方法以及其他一些不再有效的解决方案挂钩。

当前解决方案架构:

*Core(C# 类库)

*服务(C# 类库)

*WCF 服务(WCF 服务库)

*Windows 服务(Windows 服务项目)

AppInitilize() 的示例代码 [目前似乎无法正常工作]:

public class WindsorConfiguration
    {
        public static IWindsorContainer Container { get; private set; }

        public static void AppInitialize()
        {
            {
                Container = new WindsorContainer()
                    .AddFacility<WcfFacility>()
                    .Register(Component.For<IVirusCheckService>().ImplementedBy<VirusCheckService>()
                                  .LifeStyle.Transient
                                  .AsWcfService(new DefaultServiceModel()
                                                    .AddBaseAddresses("http://localhost:8080/MyService")
                                                    .AddEndpoints(WcfEndpoint.BoundTo(new BasicHttpBinding())
                                                                      .At("basic"))
                                                    .PublishMetadata(o => o.EnableHttpGet())))
                    .Register(Component.For<ILoggingService>().ImplementedBy<LoggingService>());
            }
        }

【问题讨论】:

  • 真的吗?没有人对此有任何建议吗?!肯定不是那么晦涩难懂吧?

标签: c# wcf windows-services castle-windsor


【解决方案1】:

回答问题a(有点) - 我认为没有“首选”方法 - 这实际上取决于您希望您的服务如何可用。我已经托管了 net.tcp(我怀疑这是 Windows 服务环境中最常见的,但我猜)、webhttp、basichttp 和 wshttp 服务都可以在 Windows 服务内部进行。转到b...

所以我这样做的方式(也许这只是一种风格,但它适用于我)是我有一个常规的 Windows 服务,并且在程序主中我引导容器(所以你会在 App_Start 中做的事情在全局 asax 中)并且我有我想要安装的应用程序的不同部分的安装程序(顺便说一下,通常在 WCF 中,我将合同拆分到他们自己的程序集中并在 Windows 服务程序集中实现它们,或者如果我在单独的程序集中实现它们需要在多个地方托管相同的服务)。

一旦容器被引导,我就从容器中解析 ServiceBase 并将其提供给 ServiceBase.Run 静态方法。这样,我的服务可以依赖于容器中注册的任何其他内容(这是我唯一会在容器上调用 Resolve 的地方,但我认为在这种情况下这是合理的)。

除了托管 WCF 服务之外,我不知道您还希望您的服务做什么,也许什么都没有,但这是一个让您继续前进的框架,所以它在这里......

static class Program
{
    static void Main()
    {
        ServiceBase.Run(CreateContainer().Resolve<ServiceBase>());
    }

    private static IWindsorContainer CreateContainer()
    {
        var container = new WindsorContainer();
        container.Install(FromAssembly.This());
        return container;
    }
}

public class ServicesInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container
            .AddFacility<WcfFacility>(f =>
                                          {
                                              f.CloseTimeout = TimeSpan.Zero;
                                          })
            .Register(
                Component
                    .For<IVirusCheckService>()
                    .ImplementedBy<VirusCheckService>()
                    .LifeStyle.Transient
                    .AsWcfService(new DefaultServiceModel()
                                      .AddBaseAddresses("http://localhost:8080/MyService")
                                      .AddEndpoints(WcfEndpoint.BoundTo(new BasicHttpBinding())
                                                        .At("basic"))
                                      .PublishMetadata(o => o.EnableHttpGet())),
                Component
                    .For<ServiceBase>()
                    .ImplementedBy<MyService>());
    }
}

注意:MyService 类只是一个常规的 Windows 服务类(如果你愿意,你可以使用 Visual Studio 为你生成的文件 | 新 | Windows 服务)——我没有展示它,因为它可以只是一个空的实现。

【讨论】:

  • 终于开始实施这个解决方案,我遇到了一个问题。启动服务时,我收到“错误 1083,此服务配置为运行的可执行程序未实现该服务”。据我所知,这指的是:服务名称与安装程序不匹配,或者从服务库派生的可执行文件未注册?这里有什么建议吗?
  • 如果没有更多信息,我无法确定是什么原因造成的。也许您应该创建一个包含所有相关位的新问题(例如安装程序等)。我想说的是,首先,首先创建一个服务,它只是一个普通的空服务,并确保它安装并运行良好(所以根本没有逻辑),然后添加注册 ServiceBase 的城堡部分并确保工作,然后添加 WCF 位并确保工作正常。然后你就会有一个好问题的成分(当它不起作用时停止)或者它只是起作用并且你已经解决了它。
  • 本例中的ServiceHost在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 2010-11-04
  • 1970-01-01
  • 2014-10-11
  • 2013-08-06
  • 2012-04-28
相关资源
最近更新 更多