web-dev-qa-db-ja.com

WCF起動時に関数を実行する

可能かどうかはわかりませんが、初期キャッシュデータを生成するためにWCFサービスが開始されたらすぐに関数を実行したいと思います。キャッシュの実装方法については今心配していません。私の質問は、サービスの開始時に関数を実行することです。サービスはRESTfulになります。

サービスは最終的にIISでホストされ、.Net Framework 4.5を使用しています

32
SmashCode

@KirkWollが提案したものは動作しますが、IISであり、それがApp_Codeで唯一のAppInitialize静的メソッドです。サービスごとに初期化を行う場合、別のAppInitializeメソッドを使用するか、IISを使用していない場合は、次のオプションがあります。

  • .NET Framework 4.5を使用し、IISの場合:サービスの実行時に呼び出されるサービス構成メソッドを使用できます。詳細については http://msdn.Microsoft.com/en-us/library/hh205277(v = vs.110).aspx をご覧ください。
  • サービスを自己ホストしている場合は、サービスの開始時期を制御します(ServiceHost.Open()への呼び出し。したがって、そこでサービスを初期化できます)
  • 4.5ではなくIISを使用している場合、サービスホストファクトリとカスタムサービスホストを使用して、サービスホストを開くときに呼び出すことができます。その時点で、初期化を行うことができます。サービスホストファクトリの詳細については、 http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/14/wcf-extensibility-servicehostfactory.aspx をご覧ください。

カスタムファクトリの例を以下に示します。

public class MyFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        ServiceHost Host = base.CreateServiceHost(serviceType, baseAddresses);
        Host.Opening += new EventHandler(Host_Opening);
        return Host;
    }

    void Host_Opening(object sender, EventArgs e)
    {
        // do initialization here
    }
}

}

33
carlosfigueira

最も簡単な方法は、App_CodeフォルダーをWCFプロジェクトルートの下に作成し、次のようにクラスを作成します(Initializerと呼びますが重要ではありません。重要な部分はメソッド名です)。

public class Initializer
{
    public static void AppInitialize()
    {
        // This will get called on startup
    } 
}

AppInitializeに関する詳細情報は こちら にあります。

31
Kirk Woll