7

私は、WCF の内部動作のいくつかをよりよく理解しようとしています。私はかなりの量を見回しましたが、ChannelFactory.Open()と比較して何が機能するかについての明確な説明を見つけることができませんでしたIClientChannel.Open(). 工場開設の目的は何ですか?チャネルが通信に使用されている場合、チャネルが作成されて開かれた後のプロセスでファクトリはどのような役割を果たしますか?

この質問は、他の質問の中でも特にここで尋ねられましたが、直接回答されることはありませんでした。

編集:

ソース コードを逆コンパイルした後、Open を ChannelFactory で呼び出す必要がある特定の理由をいくつか見つけました。これについては、以下で説明します。

私がまだ理解に苦しんでいるのは、ファクトリが実際には何も通信していないときに、ICommunicationObject によって提供されるメカニズムを介してこの作業が行われている理由です (私が知る限り)。オブジェクトが構築または破棄されるときに、これらのことを処理しないのはなぜですか?

私はおそらく雑草の中にいるので、そのような答えが公に入手できないかもしれないと思います. 元の質問に参加してくれた方々に感謝します。

4

3 に答える 3

6

Open は ICommunicationObject であるため、ファクトリで呼び出す必要があります。これらのいずれかを使用する前に、開く必要があります。ただし、ほとんどの場合、たとえば CreateChannel などを呼び出すと、ファクトリが自動的に開かれるため、ファクトリを明示的に開くことについて心配する必要はほとんどありません。

Close に関しては、ファクトリが使用しているバインディングによって異なります。ほとんどの場合、リソースはほとんどチャネルに関連付けられています。ただし、特定のバインディングが同じ基になる接続で複数のチャネルを多重化する可能性があるため、チャネルを閉じると、多重化されるリストからチャネルが削除されるだけです。ファクトリが閉じられたときにのみ、基礎となる接続が実際に解放されます。

于 2012-08-16T15:22:32.983 に答える
1

で関連するクラスの束を逆コンパイルした後System.ServiceModel、もう少し情報を得ることができました。

このOpen呼び出しは、継承ツリーをたどって CommunicationObject に到達し、そこでそのOpenメソッドが呼び出されるように見えます。これは、一連の診断情報を提供し、多数のイベントを発生させるだけのようです。

このChannelFactoryクラスは Open イベントを使用して、内部チャネル ファクトリの作成など、さまざまなことを行います。

protected override void OnOpening()
{
    base.OnOpening();
    this.innerFactory = this.CreateFactory();
    if (this.innerFactory == null)
    {
        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString("InnerChannelFactoryWasNotSet")));
    }
}

ここで他の人が言及したように、Close イベントは、基になるすべてのチャネルを閉じるなどのことを行うためにも使用されます (内部チャネル ファクトリを介して)。

protected override void OnClose(TimeSpan timeout)
{
    TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);
    while (true)
    {
        IChannel channel;
        lock (base.ThisLock)
        {
            if (this.channelsList.Count == 0)
            {
                break;
            }
            channel = this.channelsList[0];
        }
        channel.Close(timeoutHelper.RemainingTime());
    }
}
于 2012-08-16T17:50:21.213 に答える
0

ChannelFactoryまたはinnerchannelを開くと、オブジェクトの状態が変更されます。インスタンス化がCreated状態で開始されると、オブジェクトは構成できますが、メッセージの送受信には使用できません。Opened状態では、communicationObjectは使用できますが、構成できなくなりました

したがって、ファクトリを開く目的は単なる設計上の選択であり、最初のチャネルを作成するときに実際に自動的に行われます。内部ではそれほど多くはありません。ファクトリは、トランスポートから実際にメッセージを送信するチャネルを作成する責任があります。レイヤーを作成して、アプリケーションに送信します。

チャネルファクトリは、チャネルの作成を担当します。チャネルファクトリによって作成されたチャネルは、メッセージの送信に使用されます。これらのチャネルは、上のレイヤーからメッセージを取得し、必要な処理を実行してから、下のレイヤーにメッセージを送信する役割を果たします。次の図は、このプロセスを示しています

http://msdn.microsoft.com/en-us/library/ms789050.aspx

お役に立てれば

于 2012-08-16T05:32:59.677 に答える