1

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

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

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

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

当前解决方案架构:

*核心(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>());
            }
        }
4

1 回答 1

3

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

所以我这样做的方式(也许这只是一种风格,但它适用于我)是我有一个常规的 Windows 服务,并且在程序主中我引导容器(所以你会在全局 asax 的 App_Start 中做的事情)并且我有我想要安装的应用程序的不同部分的安装程序(顺便说一下,通常在 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 为你生成的文件 | new | windows 服务)——我没有展示它,因为它可能只是一个空实现.

于 2012-04-12T11:48:57.803 回答