Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π—Π«Πš ΠŸΠ ΠžΠ“Π ΠΠœΠœΠ˜Π ΠžΠ’ΠΠΠ˜Π― Π‘# 2005 И ΠŸΠ›ΠΠ’Π€ΠžΠ ΠœΠ .NET 2.0. 3-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 159

Автор Π­Π½Π΄Ρ€ΡŽ ВроСлсСн

Напомним, Ρ‡Ρ‚ΠΎ слой ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ взаимодСйствия .NET Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚ Π΄Π²Π° Π²ΠΈΠ΄Π° MBR-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: WKO (Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ сСрвСром) ΠΈ БАО (Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ). К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, WKO-Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ синглСт, Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности Ρ‚ΠΈΠΏΠ° RemotingConfiguration, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ динамичСски ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² срСдС выполнСния. НапримСр, Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ Main() прилоТСния SimpleRemoteObjectServer ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

static void Main(string[] args) {

 β€¦

 // Установка понятного ΠΈΠΌΠ΅Π½ΠΈ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ прилоТСния сСрвСра.

 RemotingConfiguration.ApplicationName = "ΠŸΠ΅Ρ€Π²ΠΎΠ΅ сСрвСрноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅";

 Console.WriteLine("Имя прилоТСния: {0}", RemotingConfiguration.ApplicationName);

 // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ массива Ρ‚ΠΈΠΏΠΎΠ² WellKnownServiceTypeEntry,

 // ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… зарСгистрированныС WKO-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

 WellKnownServiceTypeEntry[] WKOs = RemotingConfiguration.GetRegisteredWellKnownServiceTypes();

 // Π’Ρ‹Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

 foreach(WellKnownServiceTypeEntry wko in WKOs) {

  Console.WriteLine("Имя Π±Π»ΠΎΠΊΠ°, содСрТащСго WKO: {0}", wko.AssemblyName);

  Console.WriteLine("URL Π΄Π°Π½Π½ΠΎΠ³ΠΎ WKO: {0}", wko.ObjectUri);

  Console.WriteLine("Π’ΠΈΠΏ WKO: {0}", wko.ObjectType);

  Console.WriteLine("Π Π΅ΠΆΠΈΠΌ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ WKO: {0}", wko.MΠΎde);

 }

}

Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ список всСх WKO-Ρ‚ΠΈΠΏΠΎΠ², зарСгистрированных Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ прилоТСния сСрвСра. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Ρ†ΠΈΠΊΠ» ΠΏΠΎ всСм элСмСнтам массива Ρ‚ΠΈΠΏΠΎΠ² WellKnownServiceTypeEntry, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ характСристики ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· WKO-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вашС сСрвСрноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ рСгистрируСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ (SimpleRemotingAsm.RemoteMessageObject), Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π° рис. 18.5.

Рис. 18.5. Бтатистика сСрвСра

Π”Ρ€ΡƒΠ³ΠΈΠΌ Π²Π°ΠΆΠ½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Ρ‚ΠΈΠΏΠ° RemotingConfiguration являСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ Configure(). ВскорС Π²Ρ‹ смоТСтС ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ этот статичСский Ρ‡Π»Π΅Π½ позволяСт Π΄ΠΎΠΌΠ΅Π½Π°ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ взаимодСйствия.

Π‘Π½ΠΎΠ²Π° ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ WKO-Ρ‚ΠΈΠΏΠΎΠ²

Напомним, Ρ‡Ρ‚ΠΎ WKO-Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π»ΠΈΠ±ΠΎ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ синглСта, Π»ΠΈΠ±ΠΎ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. Π’ настоящСС врСмя вашС сСрвСрноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ рСгистрируСт WKO-Ρ‚ΠΈΠΏ с использованиСм сСмантики Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ синглСта.

// Π‘ΠΈΠ½Π³Π»Π΅Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ мноТСство ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleRemotingAsm.RemoteMessageObject), "RemoteMsgObj.soap", WellKnownObjectMode.Singleton);

Π‘Π½ΠΎΠ²Π° ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ WKO-синглСты ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ запросы ΠΎΡ‚ мноТСства ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ синглСты связаны с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ΠΌ "ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ мноТСству". Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это нСпосрСдствСнно, запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ сСрвСра (Ссли ΠΎΠ½ΠΎ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Ρ‰Π΅ Π½Π΅ выполняСтся) ΠΈ Ρ‚Ρ€ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… прилоТСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Π²Ρ‹Π²ΠΎΠ΄ сСрвСра, Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅ Ρ‚Π°ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ конструктора RemoteMessageObject.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ сСрвСрноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅ΠΌ рСгистрировался WKO-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°.

// WKO-Ρ‚ΠΈΠΏΡ‹ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° связаны с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ

// ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ΠΌ "ΠΎΠ΄ΠΈΠ½ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ".

RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleRemotingAsm.RemoteMessageObject), "RemoteMsgObj.soap", WellKnownObjectMode.SingleCall);

ПослС пСрСкомпиляции ΠΈ запуска сСрвСрного прилоТСния снова запуститС Ρ‚Ρ€ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. На этот Ρ€Π°Π· Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ создан Π½ΠΎΠ²Ρ‹ΠΉ RemoteMessageObject. Π˜Ρ‚Π°ΠΊ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ состояния ΠΎΠ±Ρ‰ΠΈΠΌΠΈ для мноТСства ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Ρ‚ΠΎ активизация синглСта оказываСтся СдинствСнным подходящим Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΎΠ³Π΄Π° всС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ "ΠΎΠ±Ρ‰Π°ΡŽΡ‚ΡΡ" с СдинствСнным экзСмпляром ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ SimpleRemotingAsm, SimpleRemoteObjectServer ΠΈ SimpleRemoteObjectClient Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Π³Π»Π°Π²Π΅ 18.

Установка сСрвСра Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ машинС

К этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π²Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ пСрСсСчСния Π³Ρ€Π°Π½ΠΈΡ† прилоТСния ΠΈ процСсса Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС. Если Ρƒ вас Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ связи с Π΄Ρ€ΡƒΠ³ΠΎΠΉ машиной, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ свой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠ³ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΈΠΏΠΎΠΌ RemoteMessageObject Ρ‡Π΅Ρ€Π΅Π· Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ машин. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.

1. На машинС сСрвСра создайтС ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ для доступа ΠΏΠ°ΠΏΠΊΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ сСрвСрной стороны,

2. Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ SimpleRemoteObjeсtServer.exe ΠΈ SimpleRemotingAsm.dll Π² эту ΠΏΠ°ΠΏΠΊΡƒ.

3. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ SimpleRemoteObjectClient ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ URL Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² соотвСтствии с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π°Π³Π΅Π½Ρ‚Π° для ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

object remoteObj = Activator.GetObject(typeof(SimpleRemotingAsm.RemoteMessageObject), "httΡ€://Π˜ΠΌΡΠ£Π΄Π°Π»Π΅Π½Π½ΠΎΠΉΠœΠ°ΡˆΠΈΠ½Ρ‹:32469/RemoteMsgObj.soap");

4. ЗапуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ SimpleRemoteObjectServer.exe Π½Π° машинС сСрвСра.

5. ЗапуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ SimpleRemoteObjectClient.exe Π½Π° машинС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

6. ΠžΡ‚ΠΊΠΈΠ½ΡŒΡ‚Π΅ΡΡŒ Π½Π° спинку крСсла, Ρ€Π°ΡΡΠ»Π°Π±ΡŒΡ‚Π΅ΡΡŒ ΠΈ ΡƒΠ»Ρ‹Π±Π½ΠΈΡ‚Π΅ΡΡŒ.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. ВмСсто понятного ΠΈΠΌΠ΅Π½ΠΈ ΠœΠ°ΡˆΠΈΠ½Ρ‹ URL Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ IP-адрСс.

ИспользованиС ВБР-каналов

Π’ настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ ваш ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ доступСн Ρ‡Π΅Ρ€Π΅Π· сСтСвой ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» HTTP. Как ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, этот ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π²ΠΏΠΎΠ»Π½Π΅ совмСстим с брандмауэром, Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈ этом ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ SOAP Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ "Ρ€Π°Π·Π΄ΡƒΡ‚Ρ‹" (ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ прСдставлСния Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ XML). Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ сСтСвой Ρ‚Ρ€Π°Ρ„ΠΈΠΊ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½ΠΈΡ… использовался TCP-ΠΊΠ°Π½Π°Π» ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚ΠΈΠΏ BinaryFormatter. Π’ΠΎΡ‚ подходящая модификация ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° сСрвСра.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Для Ρ„Π°ΠΉΠ»ΠΎΠ² с опрСдСлСниями ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², доступных ΠΏΠΎ TCP-ΠΊΠ°Π½Π°Π»Π°ΠΌ ΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ URI, Ρ‡Π°Ρ‰Π΅ всСго (Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ *.rem (ΠΎΡ‚ remote – ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ).

// ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ для сСрвСра.

using System.Runtime.Remoting.Channels.Tcp;

…

static void Main(string[] args) {

 β€¦

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ TcpChannel

 TcpChannel с = new TcpChannel(32469);

 ChannelServises.RegisterChannel(c);

 // РСгистрация WKO-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ синглСта.

 RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleRemotingAsm.RemoteMessageObject), "RemoteMsgObj.rem", WellKnownObjectMode.SingleCall);

 Console.ReadLine();

}

Π—Π΄Π΅ΡΡŒ Π² слоС ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ взаимодСйствия .NET рСгистрируСтся Ρ‚ΠΈΠΏ System. Runtime.Remoting.Channels.Tcp.TcpChannel. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ URI-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ для Π½Π΅Π³ΠΎ Π·Π°Π΄Π°Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π΅ имя RemoteMsgObj.rem вмСсто *.soap, Ρ‡Ρ‚ΠΎ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΎ Π½Π° использованиС SOAP). ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ прилоТСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Ρ‚Π°ΠΊ ΠΆΠ΅ проста.

// ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

using System.Runtime.Remoting.Channels.Π’cΡ€;

…

static void Main(string[] args) {

 β€¦

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ TcpChannel

 TcpChannel с = new TcpChannel();

 ChannelServices.RegisterChannel(c);

 // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π°Π³Π΅Π½Ρ‚Π° для ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

object remoteObj = Activator.GetObject(typeof(SimpleRemotingAsm.RemoteMessageObject), "tcp://localhost:32469/RemoteMsgObj.rem");

 // ИспользованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

 RemoteMessageObject simple = (RemoteMessageObject)remoteObj;

 simple.DisplayMessage("ΠŸΡ€ΠΈΠ²Π΅Ρ‚ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°!");

 Console.WriteLine("Π‘Π΅Ρ€Π²Π΅Ρ€ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚: {0}", simple.ReturnMessage());

 Console.ReadLine();

}

ЕдинствСнным Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ внимания ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ здСсь являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ URL Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΠΊΠ°Π½Π°Π»Π° tcp://, Π° Π½Π΅ http://. Π’ΠΎ всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ программная Π»ΠΎΠ³ΠΈΠΊΠ° здСсь оказываСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠ΅ HttpChannel,

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ TCPSimpleRemoteObjectServer ΠΈ TCPSimpleRemoteObjectClient Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Π³Π»Π°Π²Π΅ 18 (ΠΎΠ±Π° эти ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ созданный Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ SimpleRemotingAsm.dll).

НСсколько слов о IpcChannel

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ взаимодСйствия, Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Ρ‚ΠΎ .NET 2.0 ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ IpcChannel, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ самый быстрый ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… способов взаимодСйствия ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС. Π—Π°Π΄Π°Ρ‡Π΅ΠΉ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Ρ‹ являСтся ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ возмоТностСй построСния распрСдСлСнных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, выполняСмых Π½Π΅ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ, Π° Π½Π° мноТСствС ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ использования IpcChannel ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ .NET Framework 2.0 SDK (ΠΊΠ°ΠΊ ΠΈ слСдуСт ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΌΡƒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с HttpChannel ΠΈ TcpChannel).

Π€Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ взаимодСйствия

Π˜Ρ‚Π°ΠΊ, Π²Ρ‹ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ построили распрСдСлённоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ слой ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ взаимодСйствия .NET. Π’ связи c Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ прилоТСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра содСрТат большой объСм "ТСстко" ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ. НапримСр, сСрвСр ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ фиксированный ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ€Ρ‚Π°, фиксированный Ρ€Π΅ΠΆΠΈΠΌ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ фиксированный Ρ‚ΠΈΠΏ ΠΊΠ°Π½Π°Π»Π°. ΠšΠ»ΠΈΠ΅Π½Ρ‚, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, "ТСстко" ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ имя ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ пытаСтся Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ.