2012-04-08 71 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