Biblioteca de serviço do WCF hospedada como um serviço do Windows usando o problema Castle.Windsor 3.0

Eu estou querendo hospedar minha biblioteca de serviço do WCF em um serviço do windows. Embora ele esteja se comunicando com outro wcfservice em uma rede local.

Estou tendo muita dificuldade em encontrar documentação recente e atualizada ou ajudar a configurar a solução para essa finalidade. Alguém pode aconselhar:

a) Qual o ponto final preferido para este tipo de conexão? (O outro serviço WCF é hospedado usando um basicHttpBinding) - isso por si só serve para configurar o contêiner Castle através do seqüestro do global.asax. No entanto, hospedar essa solução em um serviço do Windows significa que eu não tenho mais acesso a um global.asax!

b) Como configurar Castle Windsor para usar DI com esta solução? Atualmente, procurei ligá-lo ao método AppInitilize () do App_Code e a algumas soluções não mais válidas.

Arquitetura atual da solução:

* Core (Biblioteca de Classes C #)

* Serviços (Biblioteca de Classes C #)

* WCF Servics (biblioteca de serviço do WCF)

* Serviço do Windows (projeto de serviço do Windows)

Exemplo de código para AppInitilize () [que atualmente não parece estar funcionando]:

<code>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>());
            }
        }
</code>
 M05Pr1mty10 de abr de 2012 17:07
Mesmo? Ninguém tem alguma sugestão sobre isso ?! Certamente não é tão obscuro assim?

questionAnswers(1)

QuestionSolution

a (tipo de) - Eu não acho que existe uma abordagem "preferida" - realmente só depende de como você deseja que seu serviço esteja disponível. Eu hospedei net.tcp (eu suspeito que este é o mais comum em um ambiente de serviço do Windows, mas eu estou supondo), serviços webhttp, basichttp e wshttp tudo bem dentro de um serviço do Windows. Parab...

Então, a maneira que eu faço isso (e talvez isso seja apenas uma coisa de estilo, mas funciona para mim) é que eu tenho um serviço Windows regular e no programa principal eu inicializo o contêiner (então coisas que você faria dentro App_Start no asax global ) e eu tenho instaladores para as diferentes partes do aplicativo que eu quero instalar (aliás, geralmente no WCF eu divido os contratos em seu próprio assembly e os implemento dentro do assembly de serviço do Windows, ou em um assembly separado se eu precisar hospedar o mesmo serviço em vários lugares).

Uma vez que o contêiner é inicializado, eu resolvo o ServiceBase a partir do contêiner e dou para oServiceBase.Run método estático. Dessa forma, meu serviço pode ter dependências de qualquer outra coisa que esteja registrada no contêiner (esse é o único lugar que eu jamais chamaria de Resolver no contêiner, mas acho que isso se justifica nessa circunstância).

Eu não sei o que mais você quer que seu serviço faça além de hospedar serviços WCF, talvez nada, mas isso é um pouco de framework para você ir, então aqui está ...

<code>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>());
    }
}
</code>

OBSERVAÇÃO: A classe MyService é apenas uma classe de serviço normal do Windows (você pode usar o visual studio studio para você quando for | file | new | windows service se desejar) - Eu não a mostrei porque pode ser apenas uma implementação vazia .

 kmp16 de abr de 2012 08:52
Eu não posso ter certeza do que causaria isso sem mais informações. Talvez você deva criar uma nova pergunta com todos os bits relevantes (como o instalador, etc). Eu diria que, primeiro, comece criando um serviço que é apenas um serviço vazio normal e certifique-se de que ele seja instalado e executado corretamente (sem lógica alguma) e, em seguida, adicione a parte do castelo que registra a ServiceBase e certifique-se de que funciona e, em seguida, adicionar os bits do WCF e certifique-se de que funciona. Então você terá os ingredientes para uma boa pergunta (pare quando isso não funcionar) ou simplesmente funcione e você resolveu.
 M05Pr1mty13 de abr de 2012 15:01
Ótima resposta, obrigado.
 M05Pr1mty15 de abr de 2012 14:27
Tendo finalmente começado a implementar esta solução, eu vi um problema. Ao iniciar o serviço recebo um "erro 1083 o programa executável que este serviço está configurado para executar não implementou o serviço". Tanto quanto sei, isso se refere a: nomes de serviço não correspondentes aos instaladores ou o executável que deriva da base de serviço não está registrado? Alguma sugestão aqui?
 OutOFTouch13 de nov de 2012 19:41
Onde está o ServiceHost neste exemplo?

yourAnswerToTheQuestion