3

Application_Start のカスタム servicehostfactory を介して、global.asax を使用して serviceroute を wcf サービスにマップする単純なアプリがあります。そのサービスのコンストラクターは、少し時間がかかるサービスをセットアップするための初期処理を行います。

serviceroute が自動的に追加されたときに、このコンストラクターを起動する必要があります。global.asax から clientchannel を作成し、ダミーの呼び出しを行ってサービスを起動しようとしましたが、サービスがまだ起動していないことがわかりました。

では、global.asax を介して最初にマップされたときに、サービスを手動でヒットすることなく、サービスのコンストラクターを起動するにはどうすればよいでしょうか? 残念ながら、AppFabric は私たちのオプションではないため、組み込みの自動起動をそのまま使用することはできません..

アップデート

もう少し詳しく尋ねられました。

これはルーティング管理サービスのようなものです。Service1 があり、global.asax に serviceroute として追加されます。今私はhttp://localhost/Service1を持っています

Service1 内には、「addServiceRoute」というメソッドがあります。呼び出されると、Service2 のルートも登録されます。これでhttp://localhost/Service1/Service2 ができました。

global.asax からの私の最初の解決策は、 http://localhost/service1への channelfactory を構築することでしたが、うまくいきませんでした。Service1 はまだ起動しておらず、Application_Start が返されるまで起動しませんでした (理由はまだわかりません)。そこで、最初の addserviceroute 呼び出しをごまかして、service1 のコンストラクターに移動しようと考えました。また、機能しませんでした。

これはコンストラクターに含めるべきではないと言われました-私は同意します、これはコードをテストしているだけです。

シングルトンについても言及されていましたが、これは問題ないかもしれませんが、マシン (同じアプリ プール内) に Service1 のインスタンスを複数持つつもりなので、うまくいかないと思いますか?

** 更新 #2 ** サンプル コードを求められました..ここでは、global.asax からのものです (簡潔にするために少しトリミングされています)..したがって、http://localhost/Test DOES が表示されます..しかし、使用する必要がある場合appfabric を使用して Test をウォームアップし、そのコンストラクターを起動させる場合、Test.svc などは必要ありませんか? このサービスが存在することをappfabricに確認するにはどうすればよいですか?

protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.Ignore("{resource}.axd/{*pathInfo}");
            RouteTable.Routes.Add(
                new ServiceRoute("Test", new MyServiceHostFactory(ITestService, BindingType.BasicHttpBinding, true), TestService)); 
        }
4

2 に答える 2

2

通常、各呼び出しまたはセッションは新しいインスタンス=コンストラクターへの新しい呼び出しを取得するため、説明するものにはシングルトンサービス(避けるべきもの)が必要です。自己ホスト型 WCF サービスでは、シングルトン サービス インスタンスをインスタンス化し、ServiceHostコンストラクターに渡すことができます。一緒に使用される IIS ホステッド サービスの場合、ServiceRoute派生元の独自のクラスを作成し、ServiceHostFactory作成したサービス インスタンスをパラメーターとしてそのコンストラクターに渡すことができます。このファクトリ クラスでCreateServiceHostメソッドを実装し、その既存のサービス インスタンスをServiceHostコンストラクタに渡します。これを機能させるには、サービス クラスをサービス動作を通じてシングルトンとして処理する必要があります。

ところで。コンストラクターは、時間のかかる操作を行うべきではありません。コンストラクターは、インフラストラクチャを初期化するためではなく、オブジェクトを構築するためのものです。このような初期化にコンストラクターを使用することは、そもそも悪い習慣です。

于 2012-04-09T09:33:17.060 に答える
2

AppFabric autostart は私がお勧めするものです - あなたはそれを使うことができないと言っていますが - これはそれが解決することを意図した問題です (あなたのサービスをウォームアップします)。

AppFabric が存在する前の代替手段として、初期化するサービスを呼び出す実行可能ファイルでスケジュールされたタスク (別名 cron ジョブ) を使用する必要がありました。AppFabric の自動起動のしくみは、名前付きパイプ ( net.pipe) を使用してウォームアップをトリガーすることですが、サービスがリサイクルされるときにこれとまったく同じことを行うだけです。スケジュールされたタスクのアプローチと AppFabric 自動開始の違いは、スケジュールされたタスクは、アプリケーション プールがいつリサイクルされたかを認識しないことです。サービスを定期的にポーリングして、ウォーム状態を維持する必要があります。

または、セルフホスティングを介して IIS の外部で WCF アプリケーションをホストすることを検討することもできます。これにより、ウォームアップの問題は回避されますが、IIS でホストされるコンテナーの多くの利点は得られません。HttpSelfHostServer新しい MVC Web API で参照するか、標準を使用して確認してServiceHostください。

于 2012-04-09T13:40:47.460 に答える