Webes alkalmazások fejlesztése 9. előadás. Webszolgáltatások felhasználása (ASP.NET Core &.NET Framework)

Hasonló dokumentumok
Webes alkalmazások fejlesztése 9. előadás. Webszolgáltatások felhasználása (ASP.NET WebAPI)

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 14. fejezet. Szolgáltatások adatkezelése (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

API tervezése mobil környezetbe. gyakorlat

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

Eseményvezérelt alkalmazások fejlesztése II 8. előadás. Összetett WPF alkalmazások. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Webes alkalmazások fejlesztése 10. előadás. Szolgáltatás alapú rendszerek megvalósítása (ASP.NET WebAPI) Cserép Máté

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Java Programozás 11. Ea: MVC modell

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

Webes alkalmazások fejlesztése. Bevezetés az ASP.NET MVC 5 keretrendszerbe

1. beadandó feladat dokumentáció

Webes alkalmazások fejlesztése

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Webszolgáltatások (WS)

Symfony kurzus 2014/2015 I. félév. Security: authentication, authorization, user provider, role-ok, access control, FOS user bundle

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET Core) Cserép Máté

Bevezető. Servlet alapgondolatok

Grafikus keretrendszer komponensalapú webalkalmazások fejlesztéséhez

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (ASP.NET)

3. Beadandó feladat dokumentáció

Adatbázisok webalkalmazásokban

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Giachetta Roberto

3. Beadandó feladat dokumentáció

MVC. Model View Controller

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Előszó A Windows alkalmazásfejlesztés rövid története A Windows életútja A Windows 8 paradigmaváltása... 16

2. Beadandó feladat dokumentáció

Mobil Telefonon Keresztüli Felügyelet Felhasználói Kézikönyv

Models are not right or wrong; they are more or less useful.

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET) Webfejlesztés MVC architektúrában Fejlesztés ASP.

Objektumorientált programozás C# nyelven

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) Állapotfenntartás. Állapotfenntartás. Állapotfenntartás.

OOP #14 (referencia-elv)

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk

Access adatbázis elérése OLE DB-n keresztül

Flash és PHP kommunikáció. Web Konferencia 2007 Ferencz Tamás Jasmin Media Group Kft

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

Bánsághi Anna 2015 Bánsághi Anna 1 of 31

Java Servlet technológia

Hálózatkezelés. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Hálózatkezelés / 20

1. ábra Fájl feltöltése 2. ábra Megtekintés

KROMESCH SÁNDOR APP FELHŐ. API-k és Webszolgáltatások a Cloudban. Magyarországi Web Konferencia November 8.

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

OOP és UML Áttekintés

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET Core) Cserép Máté

JNDI - alapok. Java Naming and Directory Interface

Szoftvertechnológia alapjai Java előadások

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

2. Beadandó feladat dokumentáció

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET Core) Cserép Máté

C#, OOP. Osztályok tervezése C#-ban

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (Entity Framework) Cserép Máté

Elektronikus levelek. Az informatikai biztonság alapjai II.

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk. Cserép Máté

OOP: Java 8.Gy: Abstract osztályok, interfészek

Tartalomjegyzék 2. RENDSZER FELÉPÍTÉSE... 3

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) Cserép Máté.

ASP.NET CORE MVC Model réteg bevezetése Model Binding Repository tervezési minta Dependency Injection Transient és Singleton Custom Binding AutoMapper

JAVA webes alkalmazások

ANDROID ALKALMAZÁSFEJLESZTÉS

Java. Java Message Service. ANTAL Margit. JMS API technológia. ANTAL Margit. Sapientia - EMTE

A Java EE 5 plattform

SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő PHP folytatás JDBC, ODBC

webalkalmazások fejlesztése elosztott alapon

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Ajax és Echo 2. Bokor Attila

RBLDNS DNS-based blocklists management felhasználói kézikönyv

Programozási nyelvek Java

Bevezetés Működési elv AJAX keretrendszerek AJAX

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

JavaServer Pages (JSP) (folytatás)

Objektumorientált programozás C# nyelven

Webes alkalmazások fejlesztése. 9. előadás Bevezetés az ASP.NET MVC keretrendszerbe

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Overview. Service. Application Activity Activity 2 Activity 3. Fragment. Fragment. Fragment. Frag ment. Fragment. Broadcast Receiver

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

QBE Édes Otthon lakásbiztosítás tarifáló webservice. Fejlesztői dokumentáció 1.0.2

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Segédanyag: Java alkalmazások gyakorlat

Programozás II. ATM példa Dr. Iványi Péter

Számítógépes Hálózatok. 5. gyakorlat

A C# programozási nyelv alapjai

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Webes alkalmazások fejlesztése 9. előadás Webszolgáltatások felhasználása (ASP.NET Core &.NET Framework) Cserép Máté mcserep@inf.elte.hu http://mcserep.web.elte.hu

A webszolgáltatás A webszolgáltatások lehetővé teszik az alkalmazások közötti platformfüggetlen adatcserét a legelterjedtebb modell a REST (Representational State Transfer), amely HTTP protokoll segítségével biztosítja a kommunikációt a szolgáltatás megvalósítható ASP.NET Core MVC alapon, a kliens tetszőleges alkalmazás lehet a műveletek nem csak primitív típusokat, de összetett, adatátviteli objektumokat (Data Transfer Object, DTO) is közölhetnek az objektumelvű adatok továbbítására legelterjedtebb a JSON (Javascript Object Notation) formátum ELTE IK, Webes alkalmazások fejlesztése 9:2

A kliens Az ASP.NET alapú webszolgáltatásokhoz fogyasztóként az ASP.NET WebAPI Client csomag segítségével férhetünk hozzá A HttpClient típus biztosítja a kapcsolatot HTTP alapú szolgáltatásokhoz mivel a hálózati kommunikáció időigényes, aszinkron függvények segítségével biztosítja a HTTP utasítások futtatását (GetAsync, PutAsync, ) az utasítások eredménye tartalmazza a választ (HttpResponseMessage) amennyiben a művelet sikeres (IsSuccessStatusCode), akkor feldolgozhatjuk a tartalmat (Content) ELTE IK, Webes alkalmazások fejlesztése 9:3

A kliens Pl.: using (HttpClient client = new HttpClient()) // kliens példányosítása { HttpResponseMessage response = await client.getasync("http:// "); // kérés aszinkron végrehajtása if (response.issuccessstatuscode) { HttpContent content = response.content; // tartalom feldolgozása } } // kliens megsemmisítése ELTE IK, Webes alkalmazások fejlesztése 9:4

A kliens adatkezelése A tartalom kezelése objektumorientált módon történik, az adattovábbítás formátumát a rendszer kezeli (ahogy a szolgáltató esetén is) az adatátviteli objektum átalakításának (szérializáció) és visszaállításának (deszérializáció) módja a HTTP fejlécinformációk szerint történik HttpClient GetAsync application/ json API Controller Get Deserialize { } Serialize ELTE IK, Webes alkalmazások fejlesztése 9:5

A kliens adatkezelése ehhez szükséges, hogy az adatátviteli objektum típusa a kliens és szerver oldalon is megegyezzen (pl. egyazon osztálykönyvtárból vannak meghivatkozva) olvasás esetén csak az adat típusát kell megadnunk, pl.: if (response.issuccessstatuscode) { Product myproduct = await response.content.readasasync<product>(); // tartalom feldolgozása } ugyanakkor lehetőségünk van a tartalmat szöveges (ReadAsStringAsync), vagy bináris formátumban (ReadAsByteArrayAsync), illetve adatfolyamként (ReadAsStreamAsync) kezelni ELTE IK, Webes alkalmazások fejlesztése 9:6

A kliens adatkezelése a szérializációt végző típus (MediaTypeFormatter) specializálható, így egyedi üzenetformátumok is kialakíthatóak amennyiben tartalmat is küldünk (pl. POST, DELETE), megadhatjuk annak formátumát, pl.: client.postasync("http:// ", product, new JsonMediaTypeFormatter()); // az adatot JSON formátumra szérializálja vagy közvetlenül a megfelelő formátumú adatküldést is hívhatjuk, pl.: client.postasjsonasync("http:// ", product); // az adatot JSON formátumra szérializálja ELTE IK, Webes alkalmazások fejlesztése 9:7

A kliens konfigurációja A kliensben konfigurálható a címek előtagja (BaseAddress), a kommunikáció időkorlátja (Timeout), az elküldött üzenetek fejlécének tulajdonságai (DefaultRequestHeaders), és azon belül a tartalom formátuma (DefaultRequestHeaders.Accept), pl.: client.defaultrequestheaders.accept.clear(); client.defaultrequestheaders.accept.add( new MediaTypeWithQualityHeaderValue( "application/json")); // a kliens csak a JSON formátumot fogadja el ELTE IK, Webes alkalmazások fejlesztése 9:8

Alapvető adatkezelési műveletek A szolgáltatás sok esetben alapvető adatkezelési műveleteket biztosít, ezek a CRUD műveletek létrehozás (Create), olvasás (Read), módosítás (Update), törlés (Delete) a műveleteknek adott a HTTP megfelelője (létrehozás: POST, olvasás: GET, módosítás: PUT, törlés: DELETE) a válasz kódja létrehozás esetén CREATED (201), többi művelet esetén OK (200), vagy NO CONTENT (204) amennyiben a művelet nem azonnal hajtódik végre, ACCEPTED (202) állapotot jelezhetünk egy RESTful szolgáltatásban a műveleteknek ehhez a sémához kell alkalmazkodnia ELTE IK, Webes alkalmazások fejlesztése 9:9

Kliens oldali adatkezelés A kliens oldali adatkezelést kétféleképpen valósíthatjuk meg: szinkron módon: a kliens és a szerver állapota mindig megegyezik aszinkron módon: a kliens és a szerver állapota eltér, és manuálisan szinkronizálható (mentés, betöltés, frissítés) Az aszinkron adatkezelés előnyös, ha a változtatásainkat nem egyenként, hanem csoportosan szeretnénk elmenteni ehhez kliens oldalon követnünk kell a változásokat állapotjelzőkkel (flag), és megjelölnünk, milyen változtatásokat történtek az adatokon (új, módosított, törölt) ELTE IK, Webes alkalmazások fejlesztése 9:10

Példa Feladat: Valósítsuk meg az utazási ügynökség épületeit karbantartó asztali alkalmazást. a kliens egy WPF alkalmazás lesz (TravelAgency.Admin), amely egy ASP.NET Core web API szolgáltatáshoz (TravelAgency.Service) fog csatlakozni a kliens alkalmazást MVVM architektúrában készítjük el, ahol a perzisztencia (TravelAgencyServicePersistence) biztosítja a hálózati kommunikációt az adatátvitelhez külön típust hozunk létre (BuildingDTO), és egy külön osztálykönyvtárba helyezzük el (TravelAgency.Data), amely megosztásra kerül mindkét projekt számára ELTE IK, Webes alkalmazások fejlesztése 9:11

Példa Tervezés (architektúra): «WPF application» Admin «WebAPI application» Service «Class Library» Data ELTE IK, Webes alkalmazások fejlesztése 9:12

Példa Tervezés (szolgáltatás): a szolgáltatásban egy vezérlő (BuildingsController) biztosítja a CRUD műveleteket hozzáadásnál visszaküldjük a hozzáadott épületet módosításnál és törlésnél ellenőrizzük a kapott azonosítót Data::BuildingDTO «property» + Id(): Int32 + Name(): String + CityId(): Int32 + SeaDistance(): Int32 + ShoreId(): Int32? + LocationX(): Double + LocationY(): Double + Comment(): String Controllers::BuildingsController - _context: TravelAgencyContext + BuildingsController(TravelAgencyContext) + GetBuildings(): IHttpActionResult + GetBuildingForCity(Int32): IHttpActionResult + PostBuilding(BuildingDTO): IHttpActionResult + PutBuilding(BuildingDTO): IHttpActionResult + DeleteBuilding(Int32): IHttpActionResult Controller -_context IdentityDbContext «interface» Models:: Trav elagencycontext ELTE IK, Webes alkalmazások fejlesztése 9:13

Példa Tervezés (kliens): a kliens aszinkron adatkezelést biztosít, a modell (ITravelAgencyModel) felügyeli a kliensbeli állapotot állapotjelzőkkel (DataFlag), ez alapján tudjuk mentéskor a megfelelő műveletet elvégezni a perzisztencia (ITravelAgencyPersistence) feladata az adatok betöltése, mentése és konvertálása aszinkron műveletekkel az új épületeknek létrehozunk egy ideiglenes azonosítót (a megkülönböztetés végett), amely helyett a szerver visszaad egy végleges azonosítót ELTE IK, Webes alkalmazások fejlesztése 9:14

Példa Tervezés (kliens): «interface» Model::ITravelAgencyModel + CreateBuilding(BuildingDTO): void + UpdateBuilding(BuildingDTO): void + DeleteBuilding(BuildingDTO): void + LoadAsync(): Task + SaveAsync(): Task «property» + Buildings(): IReadOnlyList<BuildingDTO> Exception Persistence::PersistenceUnavailableException + PersistenceUnavailableException(String) + PersistenceUnavailableException(Exception) «interface» Persistence::ITravelAgencyPersistence + ReadBuildingsAsync(): Task<IEnumerable<BuildingDTO>> + CreateBuildingAsync(BuildingDTO): Task<Boolean> + UpdateBuildingAsync(BuildingDTO): Task<Boolean> + DeleteBuildingAsync(BuildingDTO): Task<Boolean> Model::TravelAgencyModel Persistence:: TravelAgencyServicePersistence - _client: HttpClient ELTE IK, Webes alkalmazások fejlesztése 9:15

Példa Megvalósítás (TravelAgencyModel.cs): public async Task SaveAsync() { // az állapotjelzőnek megfelelő műveletet // végezzük el switch (_buildingflags[building]) { case DataFlag.Create: result = await _persistence.createbuildingasync(building); break; case DataFlag.Delete: } ELTE IK, Webes alkalmazások fejlesztése 9:16

Példa Megvalósítás (TravelAgencyPersistence.cs): public async Task<Boolean> CreateBuildingAsync( ){ HttpResponseMessage response = await _client.postasjsonasync("api/buildings/", building); // az értékeket azonnal JSON formátumra // alakítjuk building.id = (await response.content.readasasync<buildingdto>()).id; // a válaszüzenetben megkapjuk a végleges // azonosítót } ELTE IK, Webes alkalmazások fejlesztése 9:17

Adatkonverzió Az adatkötés során lehetőségünk van átalakítani (konvertálni) az adatot a megjelenítés és a kötött tartalom között vannak alapértelmezett átalakítások (pl. szöveg/szám) alkalmazhatunk egyedi konverziót (az IValueConverter interfész megvalósításával) cél (címke) függőségi tulajdonság (felirat) adatkötés forrás (szövegdoboz) tulajdonság (szöveg) konverzió ELTE IK, Webes alkalmazások fejlesztése 9:18

Adatkonverzió Az IValueConverter interfész biztosítja a Convert és ConvertBack műveleteket, amelyek elvégzik a transzformációt az átalakítás paraméterezhető (ConverterParameter) figyelembe veszi a nyelvi környezetet (ConverterCulture) cél Convert ConvertBack forrás A konverziót a kötésnél adjuk meg, általában erőforrásból betöltve: {Binding Path=, Converter=, ConverterParameter=, ConverterCulture= } ELTE IK, Webes alkalmazások fejlesztése 9:19

Adatkonverzió Pl.: class StringToIntConverter : IValueConverter // egyszerű szám-szöveg átalakító { public object Convert(object value, ){ return value.tostring(); } // átalakítás szöveggé } public object ConvertBack(object value, ){ return Convert.ToInt32(value); } // átalakítás számmá ELTE IK, Webes alkalmazások fejlesztése 9:20

Adatkonverzió Pl.: <Window xmlns:local="clr-namespace:myapp"> <Window.Resources> <local:stringtointconverter x:key="converter" /> <! az átalakító, mint erőforrás --> </Window.Resources> <TextBox Text="{Binding Path=, Converter={StaticResource converter} }" /> <!-- szövegdoboz, amely az adatkötéshez felhasználja az átalakítót --> ELTE IK, Webes alkalmazások fejlesztése 9:21

Adatkonverzió hibakezelése Az átalakítás során hiba léphet fel (pl. a megadott szöveg nem konvertálható számmá), amelyet megfelelően kell kezelnünk a konvertáláskor nem keletkezhet kivétel amennyiben a cél értékét nem tudjuk létrehozni (a Convert műveletben), akkor jelezzük, hogy nem kell végrehajtani a kötést (Binding.DoNothing) amennyiben a forrás tulajdonságot nem tudjuk beállítani (a ConvertBack műveletben), akkor visszaadjuk a beállítatlan függőségi értéket (DependencyProperty.UnsetValue) a beállítási hiba azonnal jelentkezik a felületen is (alapértelmezetten piros keretben) ELTE IK, Webes alkalmazások fejlesztése 9:22

Adatkonverzió hibakezelése Pl.: class StringToIntConverter : IValueConverter // egyszerű szám-szöveg átalakító { public object ConvertBack(object value, ){ try { return Convert.ToInt32(value); } catch { // elfogjuk a kivételt return DependencyProperty.UnsetValue; } // jelezzük a sikertelen beállítást } // átalakítás számmá } ELTE IK, Webes alkalmazások fejlesztése 9:23

Ellenőrzések adatkonverzióval A hibakezeléssel egybekötött átalakító használható ellenőrzések végrehajtására is nem is szükséges konvertálnia a tartalmat, csupán ellenőrzi az adat meglétét, formátumát Pl.: class EmailCheckConverter : IValueConverter // e-mail formátum ellenőrző átalakító { public object Convert (object value, ){ return value; } // nem végzünk semmilyen átalakítást ELTE IK, Webes alkalmazások fejlesztése 9:24

Ellenőrzések adatkonverzióval } public object ConvertBack(object value, ){ if (value == null!regex.ismatch(value.tostring(), @"^([0-9a-zA-Z]([-.\w]*[0-9a-zA- Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA- Z]\.)+[a-zA-Z]{2,9})$")){ // ha nem egyezik az e-mail formátum // reguláris kifejezésével return DependecyObject.UnsetValue; // akkor jelezzük a hibát } return value; // különben nem csinálunk semmit } ELTE IK, Webes alkalmazások fejlesztése 9:25

Többszörös kötés és konverzió Lehetőségünk van egy függőségi tulajdonságra több tulajdonságot is kötni (MultiBinding) több egyszerű kötés (Binding) gyűjteménye csak megfelelő konverzióval (IMultiValueConverter) jeleníthetőek meg az adatok tömbként fogadja (a kötés sorrendjében) az adatokat, és ugyanebben a sorrendben kell visszaadnia függőségi tulajdonság többszörös adatkötés konverzió tulajdonság tulajdonság ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:26

Többszörös kötés és konverzió Pl.: <TextBlock> <TextBlock.Text> <!-- szöveg összetett megadása --> <MultiBinding Converter=" "> <!-- többszörös kötés átalakítóval --> <Binding Path=" " /> <Binding Path=" " /> <!-- tetszőleges sok kötést adunk meg --> </MultiBinding> </TextBlock.Text> </TextBlock> ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:27

Többszörös kötés és konverzió Pl.: class MyMultiConverter : IMultiValueConverter { public object Convert(object[] values, ){ // egy tömbben kapjuk meg az értékeket, a // megadott kötések sorrendjében } public object[] ConvertBack(object value, ){ // egy tömbben szolgáltatjuk vissza az // eredményt, ismét a megadott sorrendben } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése II 9:28

Példa Feladat: Valósítsuk meg az utazási ügynökség épületeit karbantartó asztali alkalmazást. a jobb megjelenítés érdekében használjunk adatkonverziót a kliens oldalán, szükség lesz: a tengerpart távolság átalakítására (SeaDistanceConverter) a tengerpart típus átalakítására (ShorteTypeConverter) módosítjuk az adatátviteli típust (BuildingDTO) is, hogy az kifejezőbb legyen a megjelenítés számára, és felveszünk egy további segédtípust (CityDTO) ELTE IK, Webes alkalmazások fejlesztése 9:29

Példa Tervezés (adatátvitel): BuildingDTO + BuildingDTO() + Equals(Object): Boolean «property» + Id(): Int32 + Name(): String + City(): CityDTO + SeaDistance(): Int32 + ShoreId(): Int32? + LocationX(): Double + LocationY(): Double + Comment(): String CityDTO + Equals(Object): Boolean + ToString(): String «property» + Id(): Int32 + Name(): String ELTE IK, Webes alkalmazások fejlesztése 9:30

Példa Tervezés (kliens): IValueConverter ViewModel::SeaDistanceConverter IValueConverter ViewModel::ShoreTypeConverter - _model: ITravelAgencyModel - _viewmodel: MainViewModel - _view: MainWindow App Application + App() - App_Startup(object, StartupEventArgs): void - ViewModel_MessageApplication(object, MessageEventArgs): void - ViewModel_ExitApplication(object, System.EventArgs): void -_model «interface» Model::ITravelAgencyModel Window View::MainWindow -_view -_model -_viewmodel ViewModel::MainViewModel - _model: ITravelAgencyModel - _buildings: ObservableCollection<BuildingDTO> - _cities: ObservableCollection<CityDTO> - _currentbuilding: BuildingDTO - _isloaded: Boolean - _selectedindex: Int32 ViewModelBase + MainViewModel(ITravelAgencyModel) - OnMessageApplication(String): void - OnExitApplication(): void «property» + Buildings(): ObservableCollection<BuildingDTO> + Cities(): ObservableCollection<CityDTO> + CurrentBuilding(): BuildingDTO + IsLoaded(): Boolean + SelectedIndex(): Int32 + CreateBuildingCommand(): DelegateCommand + DeleteBuildingCommand(): DelegateCommand + ExitCommand(): DelegateCommand + LoadCommand(): DelegateCommand + SaveCommand(): DelegateCommand + UpdateBuildingCommand(): DelegateCommand «event» + MessageApplication(): EventHandler<MessageEventArgs> + ExitApplication(): EventHandler ELTE IK, Webes alkalmazások fejlesztése 9:31

Példa Megvalósítás (ShoreTypeConverter.cs): public Object Convert(Object value, ) { // ellenőrizzük az értéket // ellenőrizzük a paramétert List<String> shorenames = (parameter as IEnumerable<String>).ToList(); Int32 index = (Int32)value; if (index < 0 index >= shorenames.count) return Binding.DoNothing; } return shorenames[index]; ELTE IK, Webes alkalmazások fejlesztése 9:32

Példa Megvalósítás (MainWindow.xaml): <x:array x:key="shoretypearray"> <system:string>homokos</system:string> </x:array> <viewmodel:shoretypeconverter x:key="shoretypeconverter" /> <DataGridTextColumn Header="Tengerpart" Binding="{Binding ShoreId, Converter={StaticResource shoretypeconverter}, ConverterParameter={StaticResource shoretypearray}}" /> ELTE IK, Webes alkalmazások fejlesztése 9:33

Adatok titkosítása memóriában A teljes biztonsághoz a memóriában lévő kényes tartalmat is titkosítani kell, mivel az is potenciális támadási felület lehetőség szerint csak a feldolgozás időtartamára szerepeljen titkosítatlan információ a memóriában, egyébként kódolva tároljuk Szövegek titkosított kezelésére szolgál a SecureString típus, amely alapvetően titkosítva tárolja a jelszót, és csak lekéréskor (ToString) dekódolja a grafikus felületen a jelszavak titkosított bekérését a PasswordBox biztosítja, a Password tulajdonság feloldja a titkosítást (amely nem függőségi tulajdonság, így nem köthető) ELTE IK, Webes alkalmazások fejlesztése 9:34

Adatok titkosítása memóriában Pl.: <Button Content="Bejelentkezés" Command="{Binding LoginCommand}" CommandParameter="{Binding ElementName=passwordBox}" /> <!-- magát a jelszóbekérőt adjuk át --> LoginCommand = new DelegateCommand(param => { _model.login(username, (param as PasswordBox).Password); // kiolvassuk a titkosított jelszót } ELTE IK, Webes alkalmazások fejlesztése 9:35

Példa Feladat: Valósítsuk meg az utazási ügynökség épületeit karbantartó asztali alkalmazást. adjunk lehetőséget képek megtekintésére, hozzáadására, törlésére a képet fájlból töltjük be, majd átméretezzük (kis és nagy méretben, PNG formátumban) a képeket egyedi azonosítóval látjuk el, valamint az épület azonosítójával a biztonság növelésére az adatkezelést authentikációhoz kötjük (ASP.NET Core Identity segítségével), így a felhasználónak előbb be kell jelentkezniük az alkalmazásba ELTE IK, Webes alkalmazások fejlesztése 9:36

Példa Tervezés: létrehozunk egy vezérlőt (BuildingImageController), valamint egy adatátviteli típust (ImageDTO) a képkezeléshez a képeket alapvetően byte tömbként kezeljük, a szolgáltatás nem is ismeri azok képi tartalmát a képbetöltést egy segédtípusban (ImageHandler) végezzük a képek megjelenítéséhez átalakítást végzünk (BuildingImageConverter), ami BitmapImage típusra alakítja a tömböt, ezeket Image vezérlővel jelenítjük meg külön nézetbe szervezzük az épület adatainak megadását (BuldingEditorWindow) ELTE IK, Webes alkalmazások fejlesztése 9:37

Példa Tervezés: létrehozunk egy vezérlőt a felhasználó-kezeléshez (AccountController), ebben lehetőséget adunk bejelentkezésre (Login) és kijelentkezésre (Logout) a szolgáltatásban attribútum (Authorize) segítségével korlátozzuk az akciófüggvényekhez való hozzáférést (csak a rendszergazda csoportban lévő felhasználókra) kliens oldalon megjelenik a két új művelet a modellben (LoginAsync, LogoutAsync) a bejelentkezéshez egy külön nézetet (LoginWindow), valamint nézetmodellt (LoginViewModel) hozunk létre ELTE IK, Webes alkalmazások fejlesztése 9:38

Példa Megvalósítás (BuildingImagesController.cs): [Authorize(Roles = "administrator")] // csak bejelentkezett adminisztrátoroknak public IActionResult PostImage([FromBody] ImageDTO image) { _context.savechanges(); return Created(Request.GetUri() + image.id.tostring(), image.id); // csak az azonosítót küldjük vissza } ELTE IK, Webes alkalmazások fejlesztése 9:39

Példa Megvalósítás (ImageHandler.cs): public static Byte[] OpenAndResize(String path, Int32 height) { BitmapImage image = new BitmapImage(); // kép betöltése image.begininit(); image.urisource = new Uri(path); image.decodepixelheight = height; // megadott méretre image.endinit(); ELTE IK, Webes alkalmazások fejlesztése 9:40

Példa Megvalósítás (ImageHandler.cs): PngBitmapEncoder encoder = new PngBitmapEncoder(); // átalakítás PNG formátumra encoder.frames.add(bitmapframe.create(image)); } using (MemoryStream stream = new MemoryStream()) // átalakítás byte-tömbre { encoder.save(stream); return stream.toarray(); } ELTE IK, Webes alkalmazások fejlesztése 9:41