2

MSDN Web サイト ( http://msdn.microsoft.com/en-us/library/aa730857(v=vs .80).aspx )。

とはいえ、まだ疑問が 1 つあります。誰かが私を助けてくれることを願っています。

セッション「ステップ 3 - クライアントがアクティブ化したオブジェクトの代わりにセッションを使用する」では、私たちの会社でのリモート処理の使用方法を正確にカバーしており、反対側でインスタンス化されたリモート オブジェクトへの参照を取得して使用する方法を示しました (サーバー側)。ただし、私たちの場合、クライアントがオブジェクトへの参照を要求した時点で、サーバー側でこれらのオブジェクトをインスタンス化することはしません。オブジェクトはサーバー側に既に存在し (以前にインスタンス化されていました)、これらの既にアクティブなオブジェクトへの参照を取得したいだけです。

現在、Remoting を使用してこれを行うにはどうすればよいでしょうか? 「オブジェクト サーバー」オブジェクト (MarshalByRefObject から派生) があります。このオブジェクトは、URL「tcp://localhost:9002/ObjectServerInstance」から入手できます。リモート アプリケーションは、Activator.GetObject を使用して参照を取得できます。この Object Server オブジェクトは、インターフェイス IObjectServer を実装し、次のシグネチャを持つメソッドを宣言します。 Object GetObject (string objTag);

クライアント アプリケーションは、この Object Server オブジェクトへの参照を使用してその GetObject メソッドを呼び出し、オブジェクト タグ文字列をパラメーターとして渡します (例: "Portfolio")。次に、このメソッドは、Portfolio オブジェクトへの参照を返します。Portfolio オブジェクトは、このタグ「Portfolio」を使用して Object Server オブジェクトの前に公開されています。もちろん、Portfolio オブジェクトも MarshalByRefObject から派生しています。また、リモート クライアントが参照を要求した場合にのみインスタンス化されるのではなく、サーバー上で既にインスタンス化されています。

もちろん、これは別の方法で行うこともできます。リモートでアクセスされる可能性のある各オブジェクトは、プログラムで独自の objectUri を使用して、サーバー側のリモート処理レイヤーの前に自身を公開できます (例: “tcp://localhost:9002/MyObjectInstance”)。クライアント側では、Activator を使用できます。 .GetObject を直接使用して、各オブジェクトの参照を取得します。しかし、これは私が提起している点とは無関係です。いずれにせよ、サーバー オブジェクトは、Remoting レイヤーの前に公開するときに既に存在します。

私は十分に明確でしたか?WCF を使用してこれを行う方法はありますか?

4

2 に答える 2

0

あなたの問題には解決策がありますが、それは WCF の粒度とサービス指向の概念に反することに注意してください。

サーバー上でセッションフル状態を維持すると、あらゆる種類の影響と潜在的な落とし穴があります。クライアントとサーバー間の結合を導入し、破損状態と例外の場合に何をするかを慎重に検討する必要があります。

解決策はスタック オーバーフローの投稿には少し長すぎるため、こちらの github に投稿しました。

解決策の功績を主張することはできません-ほとんどは、どこかで読んだブログ投稿からのものです(それが何であったかを思い出したら更新します)。かなり高度な WCF の低レベル コードを使用しているという観点からは興味深いものであり、WCF のしくみについての理解を深めるのに最適です。

とにかく、これを実稼働環境に実装してそのルートをたどることを回避する方法がある場合は、さらに繰り返します。

于 2013-11-15T14:41:29.873 に答える
0

あなたが提供したリンクのコードを見ると、新しいオブジェクトを作成するのではなく、既存のオブジェクトを返すようにインターフェイスのGetInstanceMethod実装を変更する必要があるようです。IRemoteFactory

public interface IRemoteFactory
{
  IMySessionBoundObject GetInstance();
}

public class RemoteFactory : MarshalByRefObject, IRemoteFactory
{
  public IMySessionBoundObject GetInstance()
  {
    // Return an already existing object, instead of a new one.
    return MyAlreadyExistingSessionBoundObject;
  }
}
于 2013-11-13T18:06:12.107 に答える