ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ ΡΠ»ΠΎΠΉ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ .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 Π΄Π°Π½Π½ΡΠΌΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΌ "ΠΆΠ΅ΡΡΠΊΠΎ" ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΠ²Π΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΡΠ°, ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ Π°ΠΊΡΠΈΠ²ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΈΠΏ ΠΊΠ°Π½Π°Π»Π°. ΠΠ»ΠΈΠ΅Π½Ρ, Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, "ΠΆΠ΅ΡΡΠΊΠΎ" ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ ΠΈΠΌΡ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΡΡΠ°Π΅ΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ.