2009-03-31 6 views
1

状態保持COMコンポーネントに対するWebサービスインターフェイスを作成しようとしました。.net WebサービスでCOM参照を保持する

webserviceには基本的にStart、Shutdown、GetCurrentStateの操作が含まれています。

開始は、COMコンポーネントを作成し、リリースを停止します。 GetCurrentStateは、COMコンポーネントから情報を取得します。

これは簡単なことに思えましたが、1日後でもまだ動作しません。

C#オブジェクトにメンバー変数としてCOM参照を格納しようとしました。オブジェクトは常に再作成されます。 その後、セッションオブジェクトにCOM参照を格納しようとしました。しかし、まだ、何かが間違っています。

誰でも知っているどれもに保存されているCOMリファレンスをwebservices内に保存する必要がありますか?
/L

答えて

3

ここでASMXを使用していて、ライフ・タイムを少し違うように制御できるWCFではなく、リクエストを処理するクラスに要求が入るたびに、再作成されます。これはASMXの標準的な動作です。

あなたがする必要があるのは、COMオブジェクトをCache []またはApplication []コレクションの中に保存することです。作業員プールがリサイクルされると、まだ破壊されるかもしれません。このようなコードは、必要なものです。

public FooClass GetFooClassInstance() 
{ 
    FooClass instance = (FooClass)this.Context.Application["FooClassInstance"]; 

    if (instance == null) 
    { 
     instance = new FooClass(); // Creates the RCW. 
     this.Context.Application["FooClassInstance"] = instance; 
    } 

    return instance; 
} 

FooClassは、COMオブジェクトの実行時呼び出し可能ラッパーです。 Applicationオブジェクトの内容は要求間で保持されます。あなたが気を付けなければならないことの1つは、COMコンポーネントがいくつかのものを使用しているスレッドモデルは、呼び出しを1つのスレッドにマーシャリングするため、パフォーマンス上の問題を引き起こす可能性があることです。

+0

@Mitch:nullチェックの後でロックし、再度nullをチェックしてから、新しいインスタンスを作成する必要があります。 –

2

ウェブサービスの性質上、ステートレスです。 Windowsサービスを作成し、Webサービスを使用して制御してください。 StartメソッドはWindowsサービスを開始し、そのサービスはCOMコンポーネントをインスタンス化します。 GetCurrentStateメソッドはサービスと通信し、COM参照を取得します。 - > [コンポーネントサービス

  1. オープン[管理ツール]:

    別のアプローチは、アクセス可能なCOMコンポーネントのCOM +を作ることです。

  2. [COM +アプリケーション]ノードを開きます。
  3. 新しいアプリケーションを作成します。最初のウィザードのステップで「空のアプリケーションを作成」を選択します。アプリケーション名を入力し、次のステップで[サーバーアプリケーション]オプションを選択します。
  4. 新しいコンポーネントを作成します。ウィザードで[Install new component(s)]を選択します。探して、COM DLLを選択します。
  5. コンポーネントのプロパティに移動し、オブジェクトプーリングを有効にします。最小プールサイズと最大プールサイズを1に設定します。これにより、コンポーネントがシングルトンになります。
関連する問題