2013-03-04 12 views
8

私はプロキシとチャンネルについて混乱しています。私の読書によると、WCFクライアントは、一連のチャネルを通じてメッセージを渡すプロキシを使用しています。すべてのチャンネルは特定のタスクを担当しています。たとえば、1つのチャンネルがメッセージをエンコーディングし、別のチャンネルがそれを暗号化しています。WCFチャンネルに関する混乱

私の混乱がproxy.MyMethod()が呼び出されると、私は次のコード

  • を見たとき、それは実際のチャネルの全体チェーンと呼ばれる?始まりますか

  • 著者はCreateChannelと呼ばれるメソッドを使用し、識別子プロキシと命名しました。したがって、WCFアーキテクチャでは、プロキシは空間的な高水準のチャネルです。スタンドアロンのアーキテクチャ要素ではありませんか?

    Binding binding = new NetTcpBinding(); 
    EndpointAddress address = new EndpointAddress("net.tcp://localhost:8000"); 
    IMyContract proxy = ChannelFactory<IMyContract>.CreateChannel(binding,address); 
    using(proxy as IDisposable) 
    { 
        proxy.MyMethod(); 
    } 
    

答えて

3

はい、私はあなたが正確にこれを説明したと思います。 WCFには、 "チャネル"という概念があります。 開発者はweb.configで構成する傾向があり、 はC#コードを記述しません。

これらはChannel Model Overviewに記載されています。

ChannelFactory.CreateChannel(binding,address);と呼ぶと、フレームワークはあなたの設定 を見て、あなたのためにこれらすべてのチャンネルを1つのオブジェクトとして作成します。だから、プロキシはチャネルのスタックのようなものです。

最後から、1つのオブジェクトとして対話します。フレームワークは別々のチャネルの実装 を扱います。 を適切に設定できるように、これらのレイヤーを通過していることを理解することはまだ素晴らしいことです。

10

WCFには、契約、住所、およびバインディングの3つの主要コンポーネントがあります。チャネルは、これらの3つの部分に従って構築されているパイプです。

enter image description here

チャネルの目的は、両方のために理解されているフォーマットへのメッセージ、変更することです - クライアントとサーバを、そして、それは適切なトランスポートの整理します。このために、トランスポートチャネルとプロトコルチャネルが使用されます。このプロセスを簡単にするために、バインディングを使用します。各バインディングは、チャネルスタック内のいくつかのチャネルを表す要素で構成されています。

したがって、メソッドを呼び出すたびに、DataContractに従ってメッセージが形成され、チャネル全体が渡されます。各チャンネルはメッセージを変更します。 prossesは本当に抽象化のちょうどレベルでこの

enter image description here

A WCFプロキシのように見えます。これはアウトプロセスサービスのインプロセスの代表です。バインディング要素とdataContractに従ってオブジェクトを生成し、適切に構成して、クライアント側とサーバー側が互いに理解できるようにすることができます。

0

この場合、「プロキシ」はソフトウェア設計パターンへの参照です。 From Wikipedia

プロキシは、その最も一般的な形で、他の何かに インターフェイスとしてクラス機能です。プロキシは、 ネットワーク接続、メモリ内の大きなオブジェクト、ファイル、または複製するのに費用がかかり、不可能な他の何らかの リソースに接続できます。 WCFのChannelFactory <の場合

> .CreateChannelは、構成に基づいてchannel stackを作成しています。各チャネルは、その下のチャネルに抽象化を提供します。例えば、簡略化されたチャネルスタックはかもしれない:

  • チャネル1は、
  • チャネル2は、メッセージがTCPを介して送信されるメッセージ
  • チャネル3エンコードにセキュリティ情報を追加するSOAPメッセージに.NETオブジェクトをシリアル化。

あなたはすべてを理解していると思います。

「プロキシ」の使用に戻る:スタック内のどのチャネルも、その下のチャネルのプロキシです。つまり、最後の宛先はチャネルではありません。すべてのチャンネルは「他のものとのインターフェース」です。しかし、チャネルスタックを下に移動すると、異なるチャネルが呼び出し元に異なるインタフェース/抽象(.NETオブジェクト、SOAPメッセージなど)を提供しています。

ここでも、この説明はこの質問に答えるためのものであり、意図的に簡略化されています。

クライアントコードを記述する場合、最も有用なインターフェイスは.NETオブジェクトを認識するインターフェイスです。これを知ると、ChannelFactoryは、サービス契約と一致する.NETインターフェイスを持つスタックの先頭にあるチャネルを返します。 SOAPメッセージを文字列として作成し、チャネルスタックを歩いたり、カスタムスタックを作成したり、生のSOAPメッセージを受け付けるチャネルを見つけたり、その "プロキシ"にラベルを付けて直接呼び出すことは有効です。

著者がCreateChannelという名前のメソッドを使用し、識別子を という名前にしました。だからWCFアーキテクチャのプロキシはちょうど特別な高レベルです チャネル、それはスタンドアロンのアーキテクチャ要素ではありません?

チャネルは、プロキシソフトウェア設計パターンを実装するアーキテクチャ要素です。すべてのチャネルはプロキシです。クライアントコードを記述するときは、トップレベルのチャネルが.NETオペレーションコントラクトを受け入れるため、最も便利です。