Remoting Client exe NET Server exe NET Klienten










![SAO - Wellknown Objects namespace Math. Server { class Program { static void Main(string[] SAO - Wellknown Objects namespace Math. Server { class Program { static void Main(string[]](https://slidetodoc.com/presentation_image_h2/0a9f67f901994fe0058636429f2b0021/image-11.jpg)


![CAO namespace Math. Server { class Program { static void Main(string[] args) { Channel. CAO namespace Math. Server { class Program { static void Main(string[] args) { Channel.](https://slidetodoc.com/presentation_image_h2/0a9f67f901994fe0058636429f2b0021/image-14.jpg)










- Slides: 24

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 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. 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 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 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 • . 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: – 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: – – – 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 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. 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 Mainstring SAO - Wellknown Objects namespace Math. Server { class Program { static void Main(string[]](https://slidetodoc.com/presentation_image_h2/0a9f67f901994fe0058636429f2b0021/image-11.jpg)
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 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 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 Mainstring args Channel CAO namespace Math. Server { class Program { static void Main(string[] args) { Channel.](https://slidetodoc.com/presentation_image_h2/0a9f67f901994fe0058636429f2b0021/image-14.jpg)
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("? ? ? . 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. 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. exe . DLL URL IIS Server 12/14/2021 bjbu & nokn - Tietgen. Skolen 17

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 • 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å 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 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 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 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 12/14/2021 bjbu & nokn - Tietgen. Skolen 24