180 likes | 315 Views
.NET Remoting. Plan prezentacji. Co to jest .NET Remoting Definicja AppDomain Typy zdalnych obiektów Sposoby przekazywania obiektów(MBV i MBR) Formatery serializacji Dwa sposoby tworzenia aplikacji(konfigruacja z XML i konfiguracja z poziomu kodu) Zarządzanie stanem zdalnego obiektu.
E N D
.NET Remoting Łukasz Zawadzki
Plan prezentacji • Co to jest .NET Remoting • Definicja AppDomain • Typy zdalnych obiektów • Sposoby przekazywania obiektów(MBV i MBR) • Formatery serializacji • Dwa sposoby tworzenia aplikacji(konfigruacja z XML i konfiguracja z poziomu kodu) • Zarządzanie stanem zdalnego obiektu
Co to jest .NET Remoting?? • Sposób zdalnego wywoływania metod i dostępu do obiektów znajdujących się w różnych AppDomain, procesach, komputerach
Co to jest AppDomain?? • Rodzaj abstrakcyjnego obiektu reprezentującego domenę aplikacji (zbiór procesów aplikacji)
Typy zdalnych obiektów • Singlecall • Singleton • COA( Client Activated Object)
Sposoby przekazywania obiektów • MBV( Marshal by value) • MBR( Marshal by reference) • serializable
Formatery serializacji • Do czego służą formatery?? • Interfejs IRemotingFormatter • Dwa rodzaje formaterów : SoapFormatter( oparty na Simple Object Access Protocol) i BinaryFormatter
Konfiguracja • Klasa obiektu zdalnego: namespace ServerClass { public class MainClass : System.MarshalByRefObject { public int add(int a, int b) { return a+b; } } }
Konfiguracja XML • Nazwa pliku konfiguracyjnego : „*.cfg” • Po stronie serwera : Config.cfg <configuration> <system.runtime.remoting> <application> <service> <wellknown mode="SingleCall" objectUri="MyServer" type="ServerClass.MainClass, ServerClass„/> </service> <channels> <channel ref="tcp" port="8881"/> </channels> </application> </system.runtime.remoting> </configuration>
Konfiguracja XML • Kod aplikacji serwera: public static void Main() { try { RemotingConfiguration.Configure("C:\\config.cfg"); Console.ReadLine(); } catch(System.Runtime.Remoting.RemotingException e) { Console.WriteLine(e.StackTrace); Console.WriteLine("WYJATEK!!!"); Console.ReadLine(); } }
Konfiguracja XML • Po stronie klienta <configuration> <system.runtime.remoting> <application> <channels> <channel ref="tcp"> <clientProviders> <formatter ref="binary"/> </clientProviders> </channel> </channels> <client> <wellknown url="tcp://localhost:8881/MyServer" type="ServerClass.MainClass, ServerClass"/> </client> </application> </system.runtime.remoting> </configuration>
Konfiguracja XML • Kod aplikacji klienckiej: static void Main(string[] args) { //konfiguracja klienta z pliku c:\client.cfg RemotingConfiguration.Configure("C:\\client.cfg"); int a, b, c; a=3; b=4; //pośrednik reprezentujący obiekt serwerowy ServerClass.MainClass add=new ServerClass.MainClass(); c=add.add(a, b); Console.WriteLine(c); }
Konfiguracja z poziomu kodu • Serwer: public static void Main() { try { int port = 8881; TcpChannel chnl = new TcpChannel(port); ChannelServices.RegisterChannel(chnl); RemotingConfiguration.RegisterWellKnownServiceType( typeof(MainClass), „MyServer", WellKnownObjectMode.SingleCall); Console.ReadLine(); } catch(System.Runtime.Remoting.RemotingException e) { Console.WriteLine(e.StackTrace); Console.WriteLine("WYJATEK!!!"); Console.ReadLine(); } }
Konfiguracja z poziomu kodu • Klient: static void Main(string[] args) { MainClass mk = (MainClass) Activator.GetObject( typeof(MainClass), „tcp://host:port/MyServer"); "); int a, b, c; a=3; b=4; c= mk.add(a, b); Console.WriteLine(c); }
Zarządzanie stanem • InitialLeaseTime(czas przy inicjalizacji) • SponsorshipTimeout ( przedawnienie po nieudanym połączeniu) • RenewOnCallTime( o jaki czas przedłużamy życie obiektu przy każdym odwołaniu się do niego)
Przykład // metoda wywoływana na rzecz zdalnego obiektu do inicjalizacji charakterystyk czasowych jego życia public override object InitializeLifetimeService() { ILease lease = (ILease)base.InitializeLifetimeService(); if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = TimeSpan.FromMinutes(1); lease.SponsorshipTimeout =TimeSpan.FromMinutes(2); lease.RenewOnCallTime = TimeSpan.FromSeconds(2); } return lease; }
Inicjalizacja samodzielna // kod już bezspośrednio po stronie klienta ILease lease = (ILease)RemotingServices.GetLifetimeService(ZdalnyObiekt); TimeSpan expireTime = lease.Renew(TimeSpan.FromSeconds(60));
Podsumowanie • Codeguru.pl • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconnetremotingoverview.asp