2012-04-09 12 views
3

私はglobal.asaxを使って、application_Startのカスタムservicehostfactoryを介してservicerouteをwcfサービスにマッピングするシンプルなアプリケーションを用意しています。そのサービスのコンストラクタは、少し時間がかかるサービスを設定するための初期処理を行います。サービスを起動せずにglobal.asaxからサービスを開始するにはどうすればよいですか?

servicerouteが自動的に追加されたときに起動するには、このコンストラクタが必要です。私はglobal.asaxからclientchannelを作成し、サービスを起動するためのダミー呼び出しを試みましたが、サービスがまだ起動していないことを発見しました。これはapplication_startが返さなければならないと思われますか?

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

UPDATE。

これはルーティング管理サービスに似ています。だから私はService1を持っています - それはglobal.asaxのservicerouteとして追加されます。今私は持っているhttp://localhost/Service1

私は 'addServiceRoute'と呼ばれるメソッドがあります。呼び出されると、Service2のルートも登録されます。今私はhttp://localhost/Service1/Service2を持っています。

私の最初の解決策は、channelfactoryをhttp://localhost/service1にすることでしたが、それはうまくいかないでしょう。 Service1はまだ起動しておらず、Application_Startが返されるまでは起動しませんでした(まだなぜなのでしょうか?)。だから、私は騙して、最初のaddserviceroute呼び出しをservice1のコンストラクタに移動すると思った。また、動作しませんでした。

これはコンストラクタ内にあるべきではないと言われました - 私は同意します、これはちょうどテストコードです。

シングルトンも言及されているかもしれませんが、私はそれが動作するとは思わないので、(同じアプリケーションプール内の)マシン上にService1の複数のインスタンスを持つつもりですか?

** 2 ** 私は...サンプルコードのために頼まれた、ここでそれはGlobal.asaxのからあるのでhttp://localhost/Testが出てくるん...(簡潔にするためにビットをトリミング)..しかし、更新#私は、AppFabricのを使用する必要がある場合テストをウォームアップし、そのコンストラクタを起動させるためには、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)); 
     } 
+0

もう少し情報を追加できれば、私はあなたを助けることができると思います。アプリケーションプールの開始時にWCFメソッドを呼び出すようにしたいとお考えですか? AppFabricと何が関係しているのですか?これをある種のキャッシュに使用していますか? –

+0

詳細の記事で更新する – XeroxDucati

+0

AppFabricはキャッシング以上の機能を持ち、WCFサービスの管理にも役立ちます。 Auto-Startに関する情報は、http://msdn.microsoft.com/en-us/library/ee677285.aspxを参照してください。 – Rich

答えて

2

はシングルトンサービス(あなたが避けるべきもの)が必要です。自己ホストWCFサービスでは、シングルトンサービスインスタンスをインスタンス化し、ServiceHostコンストラクタに渡すことができます。 ServiceRouteと一緒に使用されるIISホストサービスの場合は、ServiceHostFactoryから派生した独自のクラスを作成し、作成されたサービスインスタンスをそのコンストラクタのパラメータとして渡すことができます。このファクトクラスでは、CreateServiceHostメソッドを実装し、既存のサービスインスタンスをServiceHostコンストラクタに渡します。この作業を行うには、サービスクラスをsingleton through service behaviorとして扱う必要があります。

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

2

AppFabricの自動起動は、あなたが使っていないと言っても、これは解決するつもりだった問題です(あなたのサービスのウォーミングアップ)。

の代替としてのAppFabricが存在する前に、あなたが初期化するサービスを呼び出し、実行可能で、スケジュールされたタスク(cronジョブ a.k.a )を使用しなければならないでしょう。 AppFabricの自動起動の仕方はusing named pipes (net.pipe) to trigger the warm upであるが、サービスがリサイクルされたときのこの正確なことだけである。スケジュールされたタスクのアプローチとAppFabricの自動起動の違いは、スケジュールされたタスクがアプリケーションプールがリサイクルされた時期を知らないことです。サービスを定期的にポーリングする必要があります。

また、IISの外部でWCFアプリケーションをセルフホスティング経由でホストすることを検討することもできます。これによりウォームアップの問題は回避されますが、IISホストコンテナの利点の多くを達成することはできません。 HttpSelfHostServer in the new MVC Web APIまたはreview using a standard ServiceHostを参照してください。

+0

AppFabricは、私が主にサービスが存在するかどうかわからないために問題になります。すべてがServiceRouteによって行われるため、起動時のアプリケーションはglobal.asaxにすぎません。つまり、appfabricはウォームアップするサービス..そこにあるsvcファイルなしでappfabricを動作させる方法はありますか? – XeroxDucati

+0

@XeroxDucati関連するコンテキストを見るために、 'global.asax'のサンプルコードを追加する必要があります。 – SliverNinja

+0

更新で追加する – XeroxDucati

関連する問題