Webszolgáltatások készítése .NET alapokon Egyszerűbb webszolgáltatások készítése Ha kérdése vagy észrevétele van
[email protected] A témakörhöz tartozó elődadás anyaga az alábbi helyről tölthető le: http://aries.ektf.hu/~ksanyi/InternetE/4.pdf
Tartalomjegyzék ASP.NET Web Form létrehozása.............................................................................................................. 1 Very_Simple_Service ............................................................................................................................... 4 Simple_Service ........................................................................................................................................ 5 Service.asmx ............................................................................................................................................ 8 MySQL telepítése és konfigurálása...................................................................................................... 8 MySQL Workbench ............................................................................................................................ 14 Kliens1 (Console Application) ................................................................................................................ 22 Szolgáltatások publikálása ..................................................................................................................... 24 Kliens2 (ASP.NET-SOAP) ........................................................................................................................ 27
ASP.NET Web Form létrehozása File New Project ASP.NET Web Forms Application (.NET Framework 3.5)
AddNew Item... 1
Web Service (ASMX)
Adjuk hozzá a projekthez a következő három állományt! 1. Very_Simple_Service.asmx 2. Simple_Service.asmx 3. Service.asmx
Alapértelmezés szerint a Default.aspx a kezdőoldal és onnan tudunk elnavigálni az egyes szolgáltatásokhoz. Igény merülhet fel fejlesztéskor, hogy az adott szolgáltatást, amelyen dolgozunk közvetlen szeretnénk futtatni, ekkor érdemes beállítani, hogy ez legyen a kezdőoldal. Set As a Start Page
2
Default.aspx fájl bővítése (Minimal Design) HTML és ASP.NET vezérlők vegyesen…
Web Services |
Very_Simple_Service |
Simple_Service |
Service |
Futtassuk az elkészített alkalmazást valamely számunkra szimpatikus böngészőben…
3
Very_Simple_Service Készítsük el az első webszolgáltatásunkat! Very_Simple_Service.asmx-hez két metódust készítünk (Fahrenheit és Celsius hőmérsékleti skálák közötti konverziók elvégzéséhez). 1. public double ConvertCelsiusToFahrenheit(string Celsius) 2. public double ConvertFahrenheitToCelsius(string Fahrenheit)
Elmélet: [°C] = ([°F] - 32) 5/9 [°F] = [°C] 9/5 + 32
public class Very_Simple_Service : System.Web.Services.WebService { [WebMethod] public double ConvertCelsiusToFahrenheit(string Celsius) { double num; if (!double.TryParse(Celsius, out num)) throw new InvalidOperationException("Value is not a number."); return ((9.0 / 5.0) * num) + 32; } [WebMethod] public double ConvertFahrenheitToCelsius(string Fahrenheit) { double num; if (!double.TryParse(Fahrenheit, out num)) throw new InvalidOperationException("Value is not a number."); return (5.0 / 9.0) * (num - 32); } }
Indítsuk el és próbáljuk ki az elkészített szolgáltatást!
4
Simple_Service A Simple_Service az előzőzőhöz képest annyival tud „többet”, hogy itt a kérésekre küldött értékeket kétfajta „adatforrásból” (string-eket tartalmazó mátrix, xml fájl) kiolvasva szolgáltatja. Planck egységekről bővebben: http://hu.wikipedia.org/wiki/Planck-egys%C3%A9gek
Szolgáltatások 1. public double UnitValue(string dimension)
2. public string UnitName(string dimension) 3. public string UnitValueFromXML(string dimension)
Simple_Service.asmx bővítése using System.Xml; using System.Data;
public class Simple_Service : System.Web.Services.WebService {
5
string[,] PlanckUnits = { {"L", "Planck length", "1,616199E-35"}, {"M", "Planck mass", "2,17651E-8"}, {"T", "Planck time", "5,39106E-44"}, {"Q", "Planck charge", "1,875545956E-18"}, {"Θ", "Planck temperature", "1,416833E+32"} }; [WebMethod] public double UnitValue(string dimension) { double num; for (int i = 0; i < PlanckUnits.GetLength(0); i++) { if (String.Compare(dimension, PlanckUnits[i, 0], true) == 0) { if (!double.TryParse(PlanckUnits[i, 2], out num)) throw new InvalidOperationException("Value is not a number."); return num; } } return 0; } [WebMethod] public string UnitName(string dimension) { // It takes the symbol as parameter and // returns name of the stock for (int i = 0; i < PlanckUnits.GetLength(0); i++) { if (String.Compare(dimension, PlanckUnits[i, 0], true) == 0) return PlanckUnits[i, 1]; } return "Unit Not Found"; } [WebMethod] public string UnitValueFromXML(string dimension) { XmlReader xmlFile; xmlFile = XmlReader.Create("c:/temp/PlanckUnits.xml", new XmlReaderSettings()); DataSet ds = new DataSet(); DataView dv; ds.ReadXml(xmlFile); dv = new DataView(ds.Tables[0]); dv.Sort = "Dimension"; int index = dv.Find(dimension); if (index == -1) { return "Unit Not Found"; } else { return dv[index]["Value"].ToString(); } } }
PlanckUnits.xml (helye: c:/temp/)
L
6
Planck length 1,616199E-35 M Planck mass 2,17651E-8 T Planck time 5,39106E-44 Q Planck charge 1,875545956E-18 Θ Planck temperature 1,416833E+32
Indítsuk el és próbáljuk ki az elkészített szolgáltatást!
7
Service.asmx Ebben a szolgásban az adatokat MySQL adatbázisban tároljuk, és onnan olvassuk ki. Mielőtt a szolgáltatást elkészítenénk, tegyünk egy kis kitérőt. (Természetesen, akinek a MySQL Server már a gépén az a telepítés és konfigurálás részt átugorhatja..)
MySQL telepítése és konfigurálása Letölthető: http://dev.mysql.com/downloads/installer/
Telepítés lépései:
8
9
Felhasználók és jogosultságok beállítása:
Nem kötelező új felhasználót hozzáadni, elég nekünk a root is (most)!
10
11
12
13
Ha minden rendben, akkor az értesítési területen máris megtalálható a kis Dolphin…
MySQL Workbench Az adatok tárolásához létre kell hozunk egy sémát és abban egy táblát! (természetesen használhatjuk az alapértelmezett sémákat is, de a egy tábla mindenképp kell ott is..) SCHEMA létrehozása
CREATE SCHEMA planck;
14
Tábla létrehozás a planck sémában CREATE TABLE planck_units( unit_id INT NOT NULL AUTO_INCREMENT, planck_dimension VARCHAR(1) NOT NULL, planck_name VARCHAR(40) NOT NULL, planck_value DOUBLE, PRIMARY KEY( unit_id ));
Feltöltés adatokkal INSERT INTO planck_units (unit_id, planck_dimension, planck_name, planck_value) VALUES (1, 'L', 'Planck length', 1.616199E-35); INSERT INTO planck_units (unit_id, planck_dimension, planck_name, planck_value) VALUES (2, 'M', 'Planck mass', 2.17651E-8); INSERT INTO planck_units (unit_id, planck_dimension, planck_name, planck_value) VALUES (3, 'T', 'Planck time', 5.39106E-44); INSERT INTO planck_units (unit_id, planck_dimension, planck_name, planck_value) VALUES (4, 'Q', 'Planck charge', 1.875545956E-18); INSERT INTO planck_units (unit_id, planck_dimension, planck_name, planck_value)
15
VALUES (5, 'Θ', 'Planck temperature', 1.416833E+32);
Execute Query
Ellenőrizzük….
Ha ezek megvannak, akkor vissza az eredeti projektünkhöz…(Service.asmx) Add reference: (remélhetőleg már elérhetőek )
MySql.Data MySql.Web
16
Névterek bővítése using using using using
MySql; MySql.Data; MySql.Data.MySqlClient; System.Data;
Adatbázis kapcsolat kialakítása (Server Explorer – Data Connections)
Lehet root vagy akit még hozzáadtunk pl. adminisztrátorként.
17
ConnectionString „kinyerése”
18
Az innen kinyert string-et ki kell egészítenünk a felhasználóhoz tartozó jelszóval. Éles szolgáltatások esetében majd egy kicsivel jobban oda kell figyelni az adatok védelmére.. De a Planck állandók közkincsnek számítanak… Connection String private string connString = "server = localhost; user id = root; password=root; database = planck";
Három szolgáltatást készítünk 1. public DataTable DataFromMySQL() 2. public DataTable DataFromMySQL2(string dimension) 3. public string DataFromMySQL3(string dimension)
Kérésre az összes adatot visszaküldi, amit a planck_unit táblában tárolunk. (DataTable) public DataTable DataFromMySQL() { MySqlConnection cnMySQL = new MySqlConnection(connString); //create your mySql command object MySqlCommand cmdMySQL = cnMySQL.CreateCommand(); //create your mySQL reeader object MySqlDataReader reader; //set the command text (query) of the //mySQL command object cmdMySQL.CommandText = "select * from planck_units"; //open the mySQL connection cnMySQL.Open(); reader = cmdMySQL.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(reader); cnMySQL.Close(); return dt; }
19
Eredmény
A kérésben megadott feltételnek megfelelő rekord planc_value mezőjéhez tartozó adatot küldi vissza (DataTable) [WebMethod] public DataTable DataFromMySQL2(string dimension) { MySqlConnection cnMySQL = new MySqlConnection(connString); MySqlCommand cmdMySQL = cnMySQL.CreateCommand(); MySqlDataReader reader; cmdMySQL.CommandText = "select planck_value from planck_units where planck_dimension = " + "'" + dimension + "'"; cnMySQL.Open(); reader = cmdMySQL.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(reader); cnMySQL.Close(); return dt; }
Eredmény
20
A kérésben megadott feltételnek megfelelő rekord planc_value mezőjének értékét küldi vissza (String).
[WebMethod] public string DataFromMySQL3(string dimension) { MySqlConnection cnMySQL = null; try { cnMySQL = new MySqlConnection(connString); string sel = "select planck_value from planck_units where planck_dimension = " + "'" + dimension + "'"; MySqlCommand cmd = new MySqlCommand(sel, cnMySQL); MySqlDataReader reader; cnMySQL.Open(); reader = cmd.ExecuteReader(); while (reader.Read()) { double num = Convert.ToDouble(reader.GetValue(0)); string s = Convert.ToString(num); return s; } cnMySQL.Close(); return "Unit Not Found"; } catch (MySqlException ex) { return "Database Error:" + ex.ToString(); } finally { if (cnMySQL != null) { cnMySQL.Close(); } }
Eredmény (kulturáltabban kezelhető)
21
URL-eket jegyezzük meg.. Kliens alkalmazás elkészítésekor még szükségünk lesz rá.. http://localhost:28542/ http://localhost:28542/Service.asmx?op=DataFromMySQL3
Kliens1 (Console Application) File-New Console Application
Add Service Reference
22
Add Web Reference…
Na itt kell majd a mentett URL (Lehet a http://localhost:XXXXX is , de az előbb elkészített szolgáltatások bármelyike is.. ) Természetesen a klienst azért igazítani kell hozzá ) Itt a Service.asmx-hez tartozó URL.
23
Kliens kódja
Ez fontos!!! using WS_Simple_Client.localhost;
namespace WS_Simple_Client { class Program { static void Main(string[] args) { Console.Write("Planck dimension: "); string s = Console.ReadLine(); Service WebService = new Service(); Console.WriteLine("Result: " + WebService.DataFromMySQL3(s)); Console.Write("Press enter to continue..."); Console.ReadKey(); } } }
Futtatás (Természetesen a szolgáltatásnak is futnia kell!!)
Szolgáltatások publikálása Vezérlőpult – Windows Szolgáltatások… IIS-kezelő konzol szükséges csak.. 24
ASP.NET alapú szolgáltatások telepítése
IIS kezelőjének indítása Keresés inetmgr Alkalmazás hozzáadása
25
Ha nem másoltuk a projektünket a c:\inetpub\wwwroot jegyzékbe akkor tegyük meg és utána folytassuk a tallózást…
Alias megadása
Próbáljuk ki!!! http://localhost/services/
Természetesen a kliensek esetében (ha a szolgáltatást már innen szeretnénk elérni) módosítanunk kell az URL-t.
26
Kliens2 (ASP.NET-SOAP) Ebben a részben egy webes klienst készítünk a Very_Simple_Service szolgáltatásunkhoz. File NewASP.NET Web Forms Application
Add Service Reference… (Namespace: ServiceReference1) Persze bármi más is adható…
Default.aspx felülete (Minimal Design)
27
Default.aspx
Kommunikáció: Kérések és válaszok SAOP XML üzeneteken keresztül a proxy szerver és kliens között. SOAP XML kapcsolat kialakítása ServiceReference1.Very_Simple_ServiceSoapClient client = new ServiceReference1.Very_Simple_ServiceSoapClient();
Default.aspx.cs using using using using
System; System.Collections.Generic; System.Linq; System.Web;
28
using System.Web.UI; using System.Web.UI.WebControls; namespace WS_Simple_Client_ASPNET { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } private string Convert(string value, int index) { ServiceReference1.Very_Simple_ServiceSoapClient client = new ServiceReference1.Very_Simple_ServiceSoapClient(); string result = null; int num; if (!int.TryParse(value, out num)) return "Must be a valid 32-bit integer!"; try { if (scaleDropDownL.SelectedIndex == 0) result = client.ConvertCelsiusToFahrenheit(inputTextB.Text).ToString(); else result = client.ConvertFahrenheitToCelsius(inputTextB.Text).ToString(); } catch (Exception e) { labelResult.ForeColor = System.Drawing.Color.Red; result = e.ToString(); } return result; } protected void convertBtn_Click(object sender, EventArgs e) { labelResult.ForeColor = System.Drawing.Color.Black; labelResult.Text = Convert(inputTextB.Text, scaleDropDownL.SelectedIndex); } } }
Indítsuk el és próbáljuk ki!
29
Megjegyzés: A Klienst is publikálhatjuk az IIS-ben! Webes kliens publikálása ugyanúgy történik, mint a szolgáltatások esetében.
30