1

Windows サービスで WCF サービス ライブラリをホストしたいと考えています。ただし、ローカル ネットワークを介して別の wcfservice と通信します。

最近の最新のドキュメントや、この目的のためにソリューションを構成するためのヘルプを見つけるのに非常に苦労しています。誰でもアドバイスできますか:

a) この種の接続に適したエンドポイントは? (他の WCF サービスは、basicHttpBinding を使用してホストされます) - これ自体は、global.asax をハイジャックして Castle コンテナーを構成するのに適しています。ただし、このソリューションを Windows サービスでホストすると、global.asax にアクセスできなくなります。

b) このソリューションで 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

質問a (一種) に答えるには - 「好ましい」アプローチがあるとは思いません - それは、サービスをどのように利用できるようにするかによって異なります。私は 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 サービス クラスです (必要に応じて、ファイル | 新規 | Windows サービスに移動したときにビジュアル スタジオが生成するものを使用できます) - 空の実装である可能性があるため、表示していません。 .

于 2012-04-12T11:48:57.803 に答える