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 csaba.biro.ekf@gmail.com 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) Add New 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 <div> </div> <table> <tr> <td align="center">web Services</td> </tr> <tr> <td align="center"> <asp:hyperlink ID="VSS" runat="server" NavigateUrl="~/Very_Simple_Service.asmx"> Very_Simple_Service</asp:HyperLink> </td> </tr> <tr> <td align="center"> <asp:hyperlink ID="SS" runat="server" NavigateUrl="~/Simple_Service.asmx"> Simple_Service</asp:HyperLink> </td> </tr> <tr> <td align="center"> <asp:hyperlink ID="S" runat="server" NavigateUrl="~/Service.asmx"> Service</asp:HyperLink> </td> </tr> </table> 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/) <?xml version="1.0" encoding="utf-8"?> <Units> <Unit> <Dimension>L</Dimension> 6
<Name>Planck length</name> <Value>1,616199E-35</Value> </Unit> <Unit> <Dimension>M</Dimension> <Name>Planck mass</name> <Value>2,17651E-8</Value> </Unit> <Unit> <Dimension>T</Dimension> <Name>Planck time</name> <Value>5,39106E-44</Value> </Unit> <Unit> <Dimension>Q</Dimension> <Name>Planck charge</name> <Value>1,875545956E-18</Value> </Unit> <Unit> <Dimension>Θ</Dimension> <Name>Planck temperature</name> <Value>1,416833E+32</Value> </Unit> </Units> 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 MySql; using MySql.Data; using MySql.Data.MySqlClient; using 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 New ASP.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 <body> <form id="form1" runat="server"> <div> Converter<br /> <br /> Value: <asp:textbox ID="inputTextB" runat="server"></asp:textbox> <br /> <br /> <asp:dropdownlist ID="scaleDropDownL" runat="server" Height="20px" Width="143px"> <asp:listitem Value="C">Celsius</asp:ListItem> <asp:listitem Value="F">Fahrenheit</asp:ListItem> </asp:dropdownlist> <br /> <br /> <asp:button ID="convertBtn" runat="server" OnClick="convertBtn_Click" Text="Convert" /> </div> <p> <asp:label ID="labelResult" runat="server"></asp:label> </p> </form> </body> 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 System; using System.Collections.Generic; using System.Linq; using 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