2012-04-08 73 views
1

我想在Windows服务中托管我的WCF服务库。虽然它将通过本地网络与另一个wcf服务进行通信。使用Castle.Windsor 3.0问题作为Windows服务托管的WCF服务库

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

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

b)如何配置Castle Windsor以使用DI解决方案?目前我已经考虑将其挂钩到App_Code的AppInitilize()方法以及其他一些不再有效的解决方案。

当前解决方案架构:

*核心(C#类库)

*服务(C#类库)

* WCF SERVICS(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>()); 
      } 
     } 
+0

真的吗?没有人对此有任何建议?!当然这不是那么模糊? – M05Pr1mty 2012-04-10 15:07:51

回答

3

要回答的问题一个(排序) - 我不认为这是一个“首选”的方法 - 它真的只是取决于你希望你的服务是可用的。我已经托管net.tcp(我怀疑这是Windows服务环境中最常见的,但我猜测),webhttp,basichttp和wshttp服务都可以在Windows服务中使用。到b ...

所以我这样做(也许这只是一种风格的东西,但它为我的作品)的办法是,我有一个常规的Windows服务,在程序主我引导容器(所以你可以在App_Start中的全局asax中执行这些工作),并且我要安装我想要安装的应用程序的不同部分(顺便说一下,通常在WCF中,我将合约拆分到自己的程序集中并在Windows服务组件中实现它们,或者如果我需要在多个地方托管相同的服务,则在单独的程序集中)。

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

我不知道你希望你的服务做的比托管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为您生成的文件) - 我没有显示它,因为它可以只是一个空实施。

+0

很好的答案,谢谢。 – M05Pr1mty 2012-04-13 13:01:37

+0

终于圆满实施这个解决方案,我遇到了一个问题。在启动服务时,我收到“错误1083该服务配置为运行的可执行程序未实现该服务”。据我所知,这指的是:服务名称与安装程序不匹配,或者源自服务基础的可执行文件未注册?这里有什么建议? – M05Pr1mty 2012-04-15 12:27:34

+1

我不能确定没有更多信息会导致什么。也许你应该用它的所有相关位创建一个新问题(比如安装程序等)。我首先要说的是,首先创建一个服务,这只是一个普通的空服务,并确保它安装并运行良好(因此根本没有逻辑),然后添加注册ServiceBase的城堡部分,并确保工作,然后添加在WCF位,并确保工作。然后你会有一个很好的问题的原料(当它不起作用时就停下来),或者它只是起作用,并且你已经解决了它。 – kmp 2012-04-16 06:52:41