Remoting Client exe NET Server exe NET Klienten

  • Slides: 24
Download presentation
Remoting Client. exe (. NET) Server. exe (. NET) • Klienten serveren som en

Remoting Client. exe (. NET) Server. exe (. NET) • Klienten serveren som en assembly (dll) – Referencen sættes på sædvanlig vis … • Serveren gør dll’en tilgængelig på flg. måder – Tjeneste på en server, der svarer på kald fra klienter. Effektivt! – Integreret i en web-tjeneste, der kaldes via URL. ”Firewall-venligt”! 12/14/2021 bjbu & nokn - Tietgen. Skolen 1

Komponent-dll • MBR-objekter arver fra Marshal. By. Ref. Object • MBV-objekter skal være Serializable

Komponent-dll • MBR-objekter arver fra Marshal. By. Ref. Object • MBV-objekter skal være Serializable namespace Komponent { public class Beregningsobjekt : System. Marshal. By. Ref. Object { private static int Objekttæller = 0; private int Objekt. ID; // Konstruktør public Beregningsobjekt() { this. Objekt. ID = ++Objekttæller; } } public Data. Objekt Hent. Data. Object() { return new Data. Objekt(); } 12/14/2021 namespace Komponent { [System. Serializable()] public class Data. Objekt {. . . } } bjbu & nokn - Tietgen. Skolen 2

Remoting - arkitektur • Generel arkitektur – Proxy, stub, formattering og channel kan ændres.

Remoting - arkitektur • Generel arkitektur – Proxy, stub, formattering og channel kan ændres. Fx er en binær formattering, der både understøttes af TCP og HTTP, mere effektiv end en tekstbaseret (XML) Server Client proxy remoting formatter 12/14/2021 stub channel bjbu & nokn - Tietgen. Skolen listener 3

Remoting - Design • Designbeslutning: MBRO eller MBVO? – Med andre ord: ”Hvor skal

Remoting - Design • Designbeslutning: MBRO eller MBVO? – Med andre ord: ”Hvor skal objekterne leve? ” • MBRO lever på serveren • MBVO lever på klienten • Gængs praksis: – Beregninger sker på serveren MBRO • Fx søgning og køb på en ehandel – Tilstande bevares på klienten MBVO • Fx indkøbskurv på en ehandel håndteres af klienten 12/14/2021 bjbu & nokn - Tietgen. Skolen 4

MBRO - muligheder • Server-activated object (SAO) også betegnet ”Wellknown objects” – Singleton: Ét

MBRO - muligheder • Server-activated object (SAO) også betegnet ”Wellknown objects” – Singleton: Ét serverobjekt til alle klienter • Trådproblemer – Single. Call: Ét objekt pr. metodekald • Nemmeste løsning; men mindst effektivt • Tilstand opretholdes vha. filer eller database • Client-activated object (CAO) – Activated: Ét objekt pr. klient • Levetidsproblem – Leasing understøttes ikke af IIS 12/14/2021 bjbu & nokn - Tietgen. Skolen 5

MBVO - muligheder • Egenudviklede klasser – Kan udføre special-opgaver på klienten • .

MBVO - muligheder • Egenudviklede klasser – Kan udføre special-opgaver på klienten • . NET collection og db-klasser – Eksempelvis Data. Set er en meget brugbar klasse til at overføre data … 12/14/2021 bjbu & nokn - Tietgen. Skolen 6

Minimér udrulning på klienten • Hvad skal udrulles på klienten? • Som udgangspunkt: –

Minimér udrulning på klienten • Hvad skal udrulles på klienten? • Som udgangspunkt: – Konkrete implementationer af alle MBRO- og MBVO-klasser – Dette vil vi som regel gerne minimere … • Mulige tilgange: – Definér MBRO vha. interfaces og udrul Interface. dll – Definér MBVO vha. . NET-klasser som fx Data. Set 12/14/2021 bjbu & nokn - Tietgen. Skolen 7

Design - Server • Minimér antal kald fra klient til server, da: – –

Design - Server • Minimér antal kald fra klient til server, da: – – – Ethvert kald går via netværket Ethvert kald er et potentielt nyt server-objekt Ethvert kald involverer marshalling Enhver reference til en property er også et kald Svartider er uforudsigelige … • Retningslinjer: – Færre og større metoder – Metoder er transaktioner – Commit/Rollback før return 12/14/2021 bjbu & nokn - Tietgen. Skolen 8

Design - Klient • Anvend factory-klasser og. config-filen – Factory-klasser skjuler instantieringslogik – Konfigurationsfilen

Design - Klient • Anvend factory-klasser og. config-filen – Factory-klasser skjuler instantieringslogik – Konfigurationsfilen kan specificere URL, formattering, channels, osv. – Konfigurationsfilen kan redirigere new til at instantiere på serveren 12/14/2021 bjbu & nokn - Tietgen. Skolen 9

Math. Library. dll namespace Math. Library { public class Simple. Math : Marshal. By.

Math. Library. dll namespace Math. Library { public class Simple. Math : Marshal. By. Ref. Object { private static int class. Count = 0; private int instance. Count; public Simple. Math() { this. instance. Count = ++Simple. Math. class. Count; } public int Add(int a, int b) { return a + b; } public int Sub(int a, int b) { return a - b; } public int Count { get { return this. instance. Count; } } 12/14/2021 bjbu & nokn - Tietgen. Skolen 10

SAO - Wellknown Objects namespace Math. Server { class Program { static void Main(string[]

SAO - Wellknown Objects namespace Math. Server { class Program { static void Main(string[] args) { Channel. Services. Register. Channel(new Http. Channel(20001), false); Remoting. Configuration. Register. Well. Known. Service. Type(typeof(Simple. Math), "Simple. Math. soap", Well. Known. Object. Mode. Single. Call); } } } namespace Math. Klient { class Program { static void Main(string[] args) { Remoting. Configuration. Register. Well. Known. Client. Type(typeof(Simple. Math), "http: //localhost: 20001/Simple. Math. soap"); Simple. Math math = new Simple. Math(); } } } 12/14/2021 bjbu & nokn - Tietgen. Skolen 11

SAO – Activator. Get. Object namespace Math. Server { class Program { static void

SAO – Activator. Get. Object namespace Math. Server { class Program { static void Main(string[] args) { Channel. Services. Register. Channel(new Http. Channel(20001), false); Remoting. Configuration. Register. Well. Known. Service. Type(typeof(Simple. Math), "Simple. Math. soap", Well. Known. Object. Mode. Single. Call); } } } namespace Math. Klient { class Program { static void Main(string[] args) { ISimple. Math math = (ISimple. Math)(Activator. Get. Object( typeof(ISimple. Math), "http: //localhost: 20001/Simple. Math. soap")); } } } 12/14/2021 bjbu & nokn - Tietgen. Skolen 12

Remoting gennem interface namespace IMath. Library { public interface ISimple. Math { int Add(int

Remoting gennem interface namespace IMath. Library { public interface ISimple. Math { int Add(int a, int b); int Sub(int a, int b); int Count {get; } } } namespace Math. Library { public class Simple. Math : Marshal. By. Ref. Object, IMath. Library. ISimple. Math private static int class. Count = 0; private int instance. Count; public Simple. Math() {this. instance. Count = ++Simple. Math. class. Count; } public int Add(int a, int b) {return a + b; } public int Sub(int a, int b) {return a - b; } public int Count { get { return this. instance. Count; } } 12/14/2021 bjbu & nokn - Tietgen. Skolen 13

CAO namespace Math. Server { class Program { static void Main(string[] args) { Channel.

CAO namespace Math. Server { class Program { static void Main(string[] args) { Channel. Services. Register. Channel(new Http. Channel(20001), false); Remoting. Configuration. Register. Activated. Service. Type(typeof(Simple. Math)); } } } namespace Math. Klient { class Program { static void Main(string[] args) { Remoting. Configuration. Register. Activated. Client. Type(typeof(Simple. Math), "http: //localhost: 20001"); Simple. Math math = new Simple. Math(); } } } 12/14/2021 bjbu & nokn - Tietgen. Skolen 14

Serveropsætning med. config-filen • Konfigurér og start serveren vha: Remoting. Configuration. Configure("? ? ?

Serveropsætning med. config-filen • Konfigurér og start serveren vha: Remoting. Configuration. Configure("? ? ? . exe. config", false); <system. runtime. remoting> <application> <service> <wellknown mode="Single. Call" object. Uri="Simple. Math. soap" type="Math. Library. Simple. Math, Math. Library" /> <!-<activated type="Math. Library. Simple. Math, Math. Library" /> --> </service> <channels> <channel ref="http" port="20001" /> </channels> </application> </system. runtime. remoting> 12/14/2021 bjbu & nokn - Tietgen. Skolen 15

Klientopsætning med. config-filen • Konfigurér klient vha. nedenstående og skab remote-objekt med new: Remoting.

Klientopsætning med. config-filen • Konfigurér klient vha. nedenstående og skab remote-objekt med new: Remoting. Configuration. Configure("? ? ? . exe. config", false); </system. runtime. remoting> <application> <client display. Name="Math. Klient. Config"> <wellknown type="Simple. Math, Math. Library" url="http: //localhost: 20001/Simple. Math. soap" /> </client> <channels> <channel ref="http" /> </channels> <!-<client url="http: //localhost: 20001"> <activated type="Simple. Math, Math. Library"></activated> </client> --> </application> </system. runtime. remoting> 12/14/2021 bjbu & nokn - Tietgen. Skolen 16

Remoting med web-server • Den letteste måde at lave remoting er vha. IIS: Klient.

Remoting med web-server • Den letteste måde at lave remoting er vha. IIS: Klient. exe . DLL URL IIS Server 12/14/2021 bjbu & nokn - Tietgen. Skolen 17

Hvordan? • Der er fire punkter … – Lav en komponent-dll til remoting –

Hvordan? • Der er fire punkter … – Lav en komponent-dll til remoting – Lav en web-applikation til at host’e dll’en – Konfigurér web-serveren – På klienten refereres til dll’en og objekterne skabes på serveren 12/14/2021 bjbu & nokn - Tietgen. Skolen 18

Design af web-serveren • Beregningsobjekter lever på serveren – Ét objekt pr. klient •

Design af web-serveren • Beregningsobjekter lever på serveren – Ét objekt pr. klient • Dataobjekter overføres til klienten – Marshalling Data Klient Proxy Beregn kald Stub Server 12/14/2021 bjbu & nokn - Tietgen. Skolen 19

Terminologi • Beregningsobjekter er single-call MBRO – Hvert RPC genererer et nyt beregningsobjekt på

Terminologi • Beregningsobjekter er single-call MBRO – Hvert RPC genererer et nyt beregningsobjekt på serveren • Dataobjekter er MBVO – De serialiseres og flyttes fysisk til klienten 12/14/2021 bjbu & nokn - Tietgen. Skolen 20

Konfiguration af web-serveren • Tilføj følgende til web. config: – Konfigurér IIS til at

Konfiguration af web-serveren • Tilføj følgende til web. config: – Konfigurér IIS til at mappe til URL’ens extension, (. rem), til remoting – URL-forespørgslen mappes nu til Math. Library. Simple. Math <system. runtime. remoting> <application> <service> <wellknown mode="Single. Call" object. Uri="Simple. Math. rem" type="Math. Library. Simple. Math, Math. Library"> </wellknown> </service> </application> </system. runtime. remoting> 12/14/2021 bjbu & nokn - Tietgen. Skolen 21

Konfiguration af klienten • Sæt referencen til dll’en på sædvanlig vis • tilgå objektet

Konfiguration af klienten • Sæt referencen til dll’en på sædvanlig vis • tilgå objektet vha. – Register. Well. Known. Client. Type() og new eller – Activator. Get. Object() • eller konfigurér vha. . config-filen herunder: <system. runtime. remoting> <application> <client> <wellknown type="Math. Library. Simple. Math, Math. Library" url="http: //localhost/Math. Service/Simple. Math. rem"> </wellknown> </client> </application> </system. runtime. remoting> 12/14/2021 bjbu & nokn - Tietgen. Skolen 22

Bemærk • Hosting på IIS forsimpler udviklingen • Nyt objekt for hvert kald forsimpler

Bemærk • Hosting på IIS forsimpler udviklingen • Nyt objekt for hvert kald forsimpler håndtering af hukommelse • Nyt objekt for hvert kald forhindrer bevarelse af tilstand – mere skalérbart, men tilstande skal nu bevares i en fil, database eller på klienten … 12/14/2021 bjbu & nokn - Tietgen. Skolen 23

Remoting For at bruge http connection skal man selv opsætte reference til System. Runtime.

Remoting For at bruge http connection skal man selv opsætte reference til System. Runtime. Remoting 12/14/2021 bjbu & nokn - Tietgen. Skolen 24