9

Streamsリモートサービスから戻ってきました( .NET Remoting)。しかしStreams、私たち全員が知っているように、処分される使い捨てのものもあります。

Disposeそれらを使い終わったら、クライアント側に電話をかけることができました。Streamただし、リモートオブジェクトからを返すときに、内部で正確に何が起こるかを知りたいです。

特に:

  1. すべてをに読みbyte[]、の代わりにそれを返す方がよいStreamでしょうか?
  2. それとも、.NET Remotingは、とにかく私のためにそれを実行していますか?
  3. そうでない場合、返されるのは?を返すのとどのようにStream異なりbyte[]ますか?結局、.NET Remotingとにかくデータをシリアル化する必要がありますか?
  4. クライアント側での呼び出しDisposeは、まったく影響がありますか?クライアント側のオブジェクトとサーバー側のオブジェクトの間に魔法のようなつながりはありますか?裏で逆シリアル化されたらDispose()、クライアント側に電話しても意味がないのでしょうか。

質問を少し改善したいので、ここでマイク・ビルトに答えています

さて、サーバーに話しかけるストリームは(少なくとも私にとっては)予想外です。

リモートオブジェクトを消費するには、次のようなことを行う必要があります。

public static class ServiceFactory <T>
{   
    public static T CreateProxy()
    {
        Type interfaceType = typeof(T);

        string uri = ApplicationServer.ServerURL + interfaceType.FullName;

        return (T)Activator.GetObject(interfaceType, uri);
    }
}

したがって、あるURIで消費する特定のリモートオブジェクトに明示的に手を差し伸べています。そして、そのリモートオブジェクトのメソッドが、MarshallByRefObjectから継承するオブジェクトを返す場合、それは自動的にリモート側のオブジェクトに関連付けられることを意味しますか?わかりました。自分で作成したテストオブジェクトを使用すると、簡単に再現できるはずです。つまり、これは、クライアント側でDisposeを呼び出す必要があり、サーバー側のオブジェクトにプロキシされることも意味しますか?

4

1 に答える 1

3

Stream は MarshalByRefObject です。それは特別な種類です。プロキシです。

  1. .NET リモート処理で両方を操作できます
  2. いいえ、それは生成されたプロキシの別のタイプです - MarshalByRefObject からの継承を探してください
  3. http://msdn.microsoft.com/en-us/library/system.marshalbyrefobject.aspx
  4. はい、プロキシ クラスに対するちょっとした魔法
于 2012-10-17T18:27:54.270 に答える