分散アプリケーションの.NETリモート処理技術開発のWCFは、(2)使用

I.はじめに

   分散アプリケーションを実現するために、メッセージキュー(MSMQ)技術上のブログの記事を共有し、.NETプラットフォームをリモーティング別の分散技術--.NETの下で、このブログで共有し続けます。

二、.NET Remotingの紹介

約2.1 .NETリモート処理

   .NETリモート処理とMSMQは、それがオフラインで利用可能をサポートしていない、さらに通信プログラム.NETプラットフォームに適しているだけです。これは、オブジェクトが別のオブジェクトによってアプリケーションドメインと相互作用することを可能にするフレームワークを提供します。プライマリアプリケーションドメインの実行中に.NETアプリケーションが別のアプリケーションドメインのアプリケーションドメインコードデータにアクセスすることはできません、しかし、いくつかのケースでは、我々はのほかに、アプリケーションドメイン間で必要通信用アプリケーションドメイン、今回は別のプログラムのターゲットドメインと対話する.NETリモート処理技術を用いて達成することができます。

2.2 .NET Remotingの基本原則

   .NETリモート処理技術オブジェクトは、双方向通信間の適用によって達成されています。まず、技術、チャネルアクセスサーバー側のオブジェクトをリモート処理して得られたクライアントは、クライアントへのオブジェクトは、このとき得られるとも呼ばれる透過プロキシプロキシ解像度は、サーバーオブジェクトへのクライアントのオブジェクトへの参照だけです。通信のパフォーマンスを最適化しながらこれは、疎結合クライアントとサーバの関連するオブジェクトを確保するだけでなく。このプロセスにおける透明プロキシを介してリモート・オブジェクトのメソッドを呼び出すクライアントは、この時間は、コールメッセージオブジェクトにパッケージされる場合、メッセージオブジェクトは、リモートオブジェクト情報を含む、呼び出されたメソッド名とパラメータ意志次いで透過プロキシ委譲実際のプロキシ(RealProxyのオブジェクト)へのコールは、チャネルにデータストリームに送信されるメッセージシーケンスのシーケンスに続いて、IMethodCallMessageを生成するメソッドを呼び出し、チャネルは、サーバ側へデータをストリーミングします。サーバは最初のメッセージをデシリアライズするためにオブジェクトを低減するために使用されるフォーマットされたデータを受信すると、サーバは、リモート・オブジェクトを活性化し、対応するメソッドを呼び出し、この方法は、処理の結果がトランス従来の方法によるものである返しします繰り返すように特定の実装原理図を以下に示します。

 

2.3 .NET Remotingのいくつかの重要な概念

   .NET Remotingの下の基本的な原則に上記の簡単な紹介、分散アプリケーション、ここでは、.NET Remotingの下に関与するいくつかの重要な概念を実装します。

  1. リモートオブジェクト:実行中のオブジェクト・サーバに直接呼び出されない、クライアント、オブジェクトが参照されているので、.NET Remotingのは、道を通過したので、リモートオブジェクトが渡さは、.NETリモートでリモートオブジェクトを可能にするのMarshalByRefObjectクラスを継承しなければなりません通信アプリケーション、ドメインの境界を越えオブジェクトアクセスのサポートに使用されます。

  2. リモートオブジェクトのアクティブ化:オブジェクトのインスタンスサーバーにアクセスする前に、それは、アクティベーションと呼ばれるプロセスを介して作成して初期化する必要があります。このクライアントは、アクティベーションオブジェクトと呼ばれているチャネルを介してリモートオブジェクトを作成します。サーバ側とクライアントの活性化活性化:.NETリモート処理では、二つのカテゴリーにリモートオブジェクトをアクティブにします。

  • アクティベーションサーバは、また、それがここでよく知られているオブジェクトの活性化パターンと呼ばれる理由WellKnow(よく知られたオブジェクト)アクティブモードとして知られていますか?サービスアプリケーションは、このタイプのよく知られたユニフォームリソース識別子(URI)にオブジェクトのインスタンスを起動する前に解放されますので、サーバは、このタイプのWellKnowオブジェクトを設定し、指定したポートまたはアドレスに基づいてオブジェクトを公開します。.NETリモートサーバ側の起動モードがシングルトンとのSingleCall二つのモードに分けられます。

  シングルトンモード:これは、ステートフルモードです。シングルトンアクティブモードに設定されている場合は、.NETリモート処理は、すべてのクライアントに同じオブジェクトのインスタンスを作成します。オブジェクトがアクティブである場合には、シングルトンのインスタンスは、彼らは、クライアントまたは他のクライアントであるかどうか、それ以降のすべてのクライアントのアクセス要求を処理します。シングルトンのインスタンスは常に静的メンバーの概念と同様に、メソッド呼び出しでその地位を維持します

  SingleCallモード:ステートレスモードです。一度この方法は、クライアントがリモートオブジェクトを呼び出したときに、リモーティングは、各クライアントのリモートオブジェクトのインスタンスを確立する、のSingleCallモードを設定し、オブジェクトインスタンスの破棄を自動的にGCによって管理されています。コンセプトは、同様のインスタンスメンバーです。

  • クライアントのアクティベーション:Wellknowモードとは異なっています。NET Remotingのは、アクティブに、各オブジェクトのインスタンスで、URI割り当てられた各クライアントタイプをアクティブにします。クライアントモードは、クライアントの要求いったん活性化され、各クライアントは、インスタンスへの参照を作成する必要があります。まず、作成されたオブジェクトインスタンスの異なる時間:のSingleCallモードはモードがあるアクティブにするために、クライアントとは異なります。顧客が通話要求がインスタンス化されますが、時に呼び出すオブジェクトメソッドのSingleCallが作成されるまで待機する必要があります一度クライアントモードが有効になります。第二に、のSingleCallモードアクティブ化オブジェクトはGCサイクル管理により、ステートレス、オブジェクトの宣言であり、クライアントアクティブ化オブジェクトは、ステートフルあり、そのライフサイクルをカスタマイズすることができます。第三に、2つの起動モードは、特にクライアントでのSingleCallモードのGetObject()によって活性化され、サーバとクライアントの実装でなく、同じ方法で、それはデフォルトコンストラクタ、アクティブモードとクライアントを介してオブジェクトを呼び出しCreateInstance()アクティブにするには、それはパラメータを渡すことができ、カスタムのインスタンスを作成するためにコンストラクタを呼び出すことが可能です。

  3.チャンネル:チャンネル.NETリモート処理を介して2つのアプリケーション・ドメイン・オブジェクト間の通信。.NETリモート処理チャネルは、タイプ4に含まれます:

  1. 監視するTcpChannel:メッセージ・フローの送信シーケンスを横切って.NETリモート処理境界を使用したTCP TCPチャネルプロトコル、監視するTcpChannelバイナリシリアライゼーション・フォーマット・メッセージ・オブジェクトをデフォルトでは、より高い伝送性能が、任意の組み込みのセキュリティ機能を提供しません。

  2. クラスHTTPChannel:チャネルを使用してHTTPのHTTPプロトコルメッセージは、メッセージ・フローのシーケンスを送信するために、インターネット上のファイアウォールを通過するために、クライアントとサーバーの間で発生する(正確にそう、主な理由は、ファイアウォールの80ポート開いている、通過ここで話すと言うことはできませんファイアウォールを介してデータを送信するために使用されるHTTPプロトコル、ポート80であれば、ファイアウォールの制限は、それはまだ)ファイアウォール経由のHTTPプロトコルはできません。デフォルトでは、シリアル化されたメッセージオブジェクトを使用してHTTPChannelに石鹸は、それがより良い相互運用性を持ち、かつセキュリティを確保するために、メッセージを暗号化するために、HTTPプロトコルの暗号化メカニズムを使用することができます。あなたは、ファイアウォールを通過したいクラスHTTPChannelを使用している場合そのため、通常、ローカル・エリア・ネットワーク内で、我々は、より多くするTcpChannelを使用します。

  3. IpcChannel:プロセス間通信、唯一のシステム・プロセス間で同一の通信を使用して、ホスト名とポート番号を必要としません。HTTPを使用TCPチャネルとチャネルは、ホスト名とポート番号を指定する必要があります。

  4. カスタムチャネル:カスタムトランスポート・チャネルは、UDPプロトコル、SMTPプロトコルとして、通信する任意の基本的なトランスポートプロトコルを使用することができます。

分散アプリケーションのトリロジーの第三に、使用.NETリモート処理技術の開発

   フロント.NET Remotingの関連するコンテンツの詳細、分散アプリケーションを開発するための.NETリモート処理技術を使用する方法について、以下の具体的な外観。3つのステップで開発された.NETリモート処理アプリケーションに最適です。

ステップ1:リモートオブジェクトを作成し、オブジェクトは、MarshalByRefObjectオブジェクトを継承しなければなりません。次のようにコードの特定の例は次のとおりです。

名前空間RemotingObject 1
2 {
3 //ステップ1:リモート・オブジェクトの作成
、リモートオブジェクトを作成// 4 -オブジェクトへのこのような支持アクセスのドメインの境界を越えて、のMarshalByRefObjectを継承しなければならない
5パブリッククラスMyRemotingObject:のMarshalByRefObject
6 {
7は//テストするために使用しますTCPチャネル
8 AddForTcpTest公共INT(A、B INTをINT)
。9 {
10リターンA + B;
11}
12である
13は、HTTP //チャネルをテストするために使用される
14 MinusForHttpTestパブリックINT(A、INT BをINT)
15 {
- B 16リターンAを;
17}
18である
。19テストするIPCチャンネル@
20 MultipleForIPCTest公共INT(int型A、int型B)は
21である{
; 22 * Bを返すある
23である}
24}
25}

  3リモートオブジェクト目的は、3つの異なるチャネルの効果を試験することである、方法定義されている。図。

ステップ2:サーバー側を作成し、次のように参照System.Runtime.Remoting.dll特定の実装コードを追加する必要があります。

。システム1を用いて、
2 System.Runtime.Remotingを使用して、
3を用いてSystem.Runtime.Remoting.Channels;
4を用いてSystem.Runtime.Remoting.Channels.Http;
5を用いてSystem.Runtime.Remoting.Channels.Ipc、
図6のシステムを使用して。 Runtime.Remoting.Channels.Tcp;
7。
8 RemotingServerHost名前空間。
9 {
10 //ステップ2:ホストアプリケーションの作成
11クラスサーバー。
12れる{
13メイン静的ボイド(文字列[]引数)で
14 {
15 // 1. 3つ作成チャネル
16
17 // TCPチャネルを作成し、ポート番号9001。
18が監視するTcpChannel =新しい新するTcpChannelするTcpChannel(9001)である
。19
20のHttp //チャネルが作成され、ポート番号9002
21(9002)=新たな新しいクラスHTTPChannel HTTPChannelにHTTPChannelにあり、
22で
23 // IPCチャネル作成されポート番号9003
24 IpcChannel ipcChannel =新しいIpcChannel( "IpcTest")。
25
26 // 2注册通道
27 ChannelServices.RegisterChannel(偽するTcpChannel)。
28 ChannelServices.RegisterChannel(HTTPChannelに、偽の);
29 ChannelServices.RegisterChannel(ipcChannel、偽)。
30
31 //打印通道信息
32 //打印Tcpの通道的名称
33 Console.WriteLineを( "するTcpChannelの名前は{0}"、tcpChannel.ChannelName)。
34 //打印Tcpの通道的优先级
35 Console.WriteLineを( "するTcpChannelの優先度は{0}"、tcpChannel.ChannelPriority)。
36
37 Console.WriteLineを(httpChannel.ChannelName "クラスHTTPChannelの名前は{0}です")。
38 Console.WriteLineを(httpChannel.ChannelPriority "HTTPChannelに優先度が{0}です")。

40 Console.WriteLineを(ipcChannel.ChannelName "IpcChannelの名前は{0}です")。
41 Console.WriteLineを(ipcChannel.ChannelPriority "IpcChannelの優先度は{0}です")。
42
43 // 3注册对象
44 //注册MyRemotingObject到.NETリモート运行库中
45 RemotingConfiguration.RegisterWellKnownServiceType(typeof演算(RemotingObject.MyRemotingObject)、 "MyRemotingObject"、WellKnownObjectMode.Singleton)。
46 Console.WriteLineを(「終了する任意のキーを押してください」);
47 Console.ReadLine();
48}
49}
50}

ステップ3:クライアントプログラムを作成し、特定の実装コードは次のように: 

1 RemotingObjectを使用して、
2システムを使用しました。
3
4名前空間RemotingClient
5 {
6クラスクライアント
7 {
8静的な無効メイン(文字列[] args)
9 {
10 //使用Tcpの通道得到远程对象
11 //監視するTcpChannelするTcpChannel =新しいするTcpChannel()。
12 //ChannelServices.RegisterChannel(tcpChannel)、偽;
13 MyRemotingObject proxyobj1 = Activator.GetObject(typeof演算(MyRemotingObject)、 "TCP:// localhostを:9001 / MyRemotingObject")MyRemotingObjectとして;
14 IF(proxyobj1 == NULL)
15 {
16 Console.WriteLineを( "连接TCP服务器失败")。
17}
18
19 //クラスHTTPChannel HTTPChannelに=新しいHTTPChannelに()。
20 //ChannelServices.RegisterChannel(httpChannel)、偽。
21 MyRemotingObject proxyobj2 = Activator.GetObject(typeof演算(MyRemotingObject)、 "HTTP:// localhostを:9002 / MyRemotingObject")MyRemotingObjectとして;
22 IF(proxyobj2 == NULL)
23 {
24 Console.WriteLineを( "连接のHttp服务器失败")。
25}
26
27 // IpcChannel ipcChannel =新しいIpcChannelを();
28 //ChannelServices.RegisterChannel(ipcChannel)、偽;
29 MyRemotingObject proxyobj3 = Activator.GetObject(typeof演算(MyRemotingObject)、 "IPC:// IpcTest / MyRemotingObject")MyRemotingObjectとして;
30 IF(proxyobj3 == NULL)
31 {
32 Console.WriteLineを( "连接IPC服务器失败")。
33}
34 //输出信息
35 Console.WriteLineを( "するTcpChannelによってこの呼オブジェクト、100 + 200 = {0}"、proxyobj1.AddForTcpTest(100、
36 Console.WriteLineを( "クラスHTTPChannelによってこの呼オブジェクト、100から200 = {0}"、proxyobj2.MinusForHttpTest(100、200));
37 Console.WriteLineを( "IpcChannelによってこの呼オブジェクト、100 * 200 = {0}"、proxyobj1.MultipleForIPCTest(100、200));
38 Console.WriteLineを( "終了する任意のキーを押してください!");
39 Console.ReadLine();
40}
41}
42}

  上記の3つのステップの後、我々は分散アプリケーションの開発を完了して、プログラムの下で、次のテストは、最初にすべての、サーバー側で実行するために、正常に機能して、次のインタフェースが表示されます。

  .NETリモート処理では、複数のチャンネルを作成することができますが、名前はチャンネルを識別するために使用される一意の識別子であるので、異なっていなければならないの.NET Remotingのチャンネル名を必要としています。しかし、上記のコードは、我々はそれを成功させることができる理由は、チャネルの名前を指定していませんか?私たちは、チャネルを作成するときに明示的にチャネルの名前を指定しない場合は、上記の写真から、対応するチャンネルタイプを使用すると、複数のチャネルはTCPを登録したい場合は、TCPなどするTcpChannelは、チャンネル名になり、チャンネル名として使用されますあなたは明示的にその名前を指定する必要があります。

  以下に示すように、クライアントの特定の操作の効果、クライアントを実行して得られた以下の結果を参照してください。

 分散プロファイルの使用は、上記の手順を書き換えます

  第三部では、我々は、サーバーの方法およびチャネルアドレスの様々な書き込みをするためのプログラムで死んでいる、このような実装は、途中に、サーバ側とサーバアドレスのチャネルタイプを設定するには、次の構成ファイルを使用し、展開すると便利ではありません。次のようにサーバーの構成ファイルを実装して、次のコードを参照してください直接、リモートオブジェクトの定義を変更する必要はありません。

1システムを使用しました。
2 System.Runtime.Remotingを使用して、
3 System.Runtime.Remoting.Channelsを使用して、
4
5名前空間RemotingServerHostByConfig
6 {
7クラスプログラム
8 {
9静的な無効メイン(文字列[]引数)
10 {
11 RemotingConfiguration.Configure( "RemotingServerHostByConfig.exe.config"、偽)。
12
13のforeach(ChannelServices.RegisteredChannelsにおけるVARチャネル)
14 {
15 //打印通道的名称
16 Console.WriteLineを( "チャンネルの名前は{0}"、channel.ChannelName)。
17 //打印通道的优先级
18 Console.WriteLineを( "チャネルの優先度は{0}"、channel.ChannelPriority)。
19}
20 Console.WriteLineを( "按任意键退出......")。
21 Console.ReadLine();
22}
23}
24}

  サーバーの設定ファイルの内容は次のとおりです。

1の<?xml version = "1.0"エンコード= "UTF-8"?>
2 <! -服务端App.configファイル的内容- >
3 <構成>
4 <起動時>
5 <supportedRuntimeバージョン= "V4.0 "SKU ="。NETFramework、バージョン= V4.5" />
6 </スタートアップ>
7 <system.runtime.remoting>
8 <アプリケーション>
9 <サービス>
10 <周知モード= "シングルトン"
11種類= "RemotingObject。 MyRemotingObject、RemotingObject」
12 objectUri = "MyRemotingObject" />
13 </サービス>
14 <チャネル>
15 <チャネルポート= "9001" REF = "TCP" />
16 <チャネルポート= "9002" REF = "HTTP" / >
17 <チャネルのportName = "IpcTest" REF = "IPC" /> <! - IPCのチャネルは、ポート番号を必要としない- >
18 </チャンネル>である
。19 </ファイルアプリケーション>
20 </system.runtime.remoting>であります
21 </構成>

  この場合、クライアントプログラムの実装コードを以下に示します。

1 RemotingObjectを使用して、
2システムを使用しました。
3 System.Runtime.Remotingを使用して、
4
5名前空間RemotingClientByConfig
6 {
7クラスプログラム
8 {
9静的な無効メイン(文字列[]引数)
10 {
11 //使用HTTP通道得到远程对象
12 RemotingConfiguration.Configure( "RemotingClientByConfig.exe.config"、偽)。
13 MyRemotingObject proxyobj1 =新しいMyRemotingObject()。
14 IF(proxyobj1 == NULL)
15 {
16 Console.WriteLineを( "连接服务器失败")。
17}
18
19 Console.WriteLineを( "するTcpChannelによってこの呼オブジェクト、100 + 200 = {0}"、proxyobj1.AddForTcpTest(100、200));
20 Console.WriteLineを( "クラスHTTPChannelによってこの呼オブジェクト、100から200 = {0}"、proxyobj1.MinusForHttpTest(100、200));
21 Console.WriteLineを( "IpcChannelによってこの呼オブジェクト、100 * 200 = {0}"、proxyobj1.MultipleForIPCTest(100、200));
22 Console.WriteLineを( "終了する任意のキーを押してください!");
23 Console.ReadLine();
24}
25}
26}

  クライアントの設定ファイル:

1の<?xml version = "1.0"エンコード= "UTF-8"?>
2 <構成>
3 <起動時>
4 <supportedRuntimeバージョン= "V4.0" SKU =」。NETFramework、バージョン= V4.5" />
5 </スタートアップ>
6 <system.runtime.remoting>
7 <アプリケーション>
8 <クライアント>
9 <周知のタイプ= "RemotingObject.MyRemotingObject、RemotingObject"
10 URL = "HTTP:// localhostを:9002 / MyRemotingObject" />
11 </クライアント>
12 <チャネル>
13 <チャネルREF = "TCP"ポート= "0"> </チャネル>
14 <チャネルREF = "HTTP"ポート= "0"> </チャネル>
15 <チャネルREF =」 IPCの」ポート= "0"> </チャネル>
16 </チャネル>
17 </アプリケーション>
18 </system.runtime.remoting>
19 </構成>

  業績は、ここでは、コンフィギュレーション・ファイルを使用して、同じの前の実行の結果を変更した後、プログラムを分散マップではありません。

V.の概要

   ここでは、.NETリモート処理技術を共有するために、これは基本的な導入を行うには.NETリモート処理技術のためである、以上です。次の記事では、我々は皆のための別の分散技術--webサービスを共有し続けます。

 

転送します。https://www.cnblogs.com/zhili/p/MSMQ.html、著者:ハード学びます。

侵害した場合、削除するために私に連絡してください!

おすすめ

転載: blog.csdn.net/IT_0802/article/details/91493492