8

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

次のコードを見たとき、私の混乱が始まりました

  • 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();  
    }  
    
4

3 に答える 3

11

WCF には、コントラクト、アドレス、バインディングの 3 つの主要コンポーネントがあります。チャンネルは、これらの 3 つの部分に従って構築されているパイプです。

ここに画像の説明を入力

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

したがって、メソッドを呼び出すたびに、DataContract に従ってメッセージが形成され、チャネルのチェーン全体に渡されます。各チャネルはメッセージを変更します。プロセスはこんな感じ

ここに画像の説明を入力

WCF プロキシは、実際には抽象化のレベルにすぎません。これは、アウトプロセス サービスのインプロセス代表です。バインディング要素と dataContract に従って生成され、適切に構成されたオブジェクトとして想像できます。これにより、クライアント側とサーバー側が相互に理解できるようになります。

于 2013-03-13T12:56:43.547 に答える
3

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

これらについては、チャネル モデルの概要で説明されています。

フレームワークを呼び出すとChannelFactory.CreateChannel(binding,address);、構成が調べられ、これらすべてのチャネルが 1 つのオブジェクトとして作成されます。そうです、プロキシはチャネルのスタックのようなものです。

あなたの側からは、それを 1 つのオブジェクトとして操作します。フレームワークは、個別のチャネルの実装を扱います。これらのレイヤーを適切に構成できるように、これらのレイヤーを通過していることを理解しておくと便利です。

于 2013-03-04T12:19:51.350 に答える
0

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

最も一般的な形式のプロキシは、他の何かへのインターフェイスとして機能するクラスです。プロキシは、ネットワーク接続、メモリ内の大きなオブジェクト、ファイル、またはコストがかかるか複製が不可能なその他のリソースなど、あらゆるものとやり取りできます。

WCF の場合、ChannelFactory<>.CreateChannel は構成に基づいてチャネル スタックを作成しています。各チャネルは、その下のチャネルに抽象化を提供します。たとえば、単純化されたチャネル スタックは次のようになります。

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

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

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

繰り返しますが、この議論は質問に答えるために意図されており、意図的に単純化されています。

クライアント コードを作成するときに最も役立つインターフェイスは、.NET オブジェクトを理解するインターフェイスです。これを知っている ChannelFactory は、サービス コントラクトに一致する .NET インターフェイスを持つスタックの最上位にあるチャネルを返します。SOAP メッセージを文字列として作成し、チャネル スタックをたどって (またはカスタム スタックを作成し)、未加工の SOAP メッセージを受け入れるチャネルを見つけ、それを「プロキシ」とラベル付けして、それを直接呼び出すことが有効です。

作成者は CreateChannel と呼ばれるメソッドを使用し、識別子プロキシに名前を付けました。WCF アーキテクチャでは、プロキシは単なる特別な高レベル チャネルであり、スタンドアロンのアーキテクチャ要素ではありませんか?

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

于 2013-03-14T17:23:20.597 に答える