Veelal worden deze cross-netwerk aanroepen gedaan via het Simple Object Access Protocol (SOAP), een XML-gebaseerd protocol dat aangeeft hoe request en response moeten opgemaakt worden voor transfer via HTTP.
Web Services vormen de volgende stap in de object-georiënteerde filosofie: in plaats van software te ontwikkelen vanuit een klein aantal klassenbibliotheken die op één locatie staan, hebben programmeurs toegang tot Web Service klassen die wereldwijd toegankelijk zijn.
De machine die de Web Service huist wordt de Remote Machine genoemd.
BMI.asmx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; namespace BMI_Service { [WebService(Namespace = "http://3ejaar.grad.ivo/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class BMI : System.Web.Services.WebService { [WebMethod] public string EvalueerBMI(Single bmi) { string evaluatie = ""; if (bmi < 5 || bmi > 200) return "U hebt ongeldige gegevens ingevoerd."; else if (bmi <= 17.0) evaluatie = "U hebt een extreem ondergewicht."; else if (bmi <= 20.0) evaluatie = "U hebt een ondergewicht."; else if (bmi <= 25.0) evaluatie = "U hebt een normaal, gezond gewicht ! "; else if (bmi <= 30.0) evaluatie = "U lijdt aan overgewicht."; else if (bmi > 30) evaluatie = "U bent obees."; return evaluatie; } [WebMethod] public Double BerekenBMI(string gewicht, string lengte_cm) { Single g = 0; Single l = 0; try { g = Convert.ToSingle(gewicht); l = Convert.ToSingle(lengte_cm); } catch (Exception e) { return 0.0; } Single lengte_m = l / 100f; Single bmi = g/(lengte_m * lengte_m); return System.Math.Round( bmi,2); } } } BMI.asmx (Automatisch gegenereerd in VS.Net, openen in bvb. Notepad) <%@ WebService Language="C#" CodeBehind="BMI.asmx.cs" Class="BMI_Service.BMI" %>
Webmethoden worden aangeroepen via een Remote Procedure Call (RPC): we roepen een bepaalde functionaliteit aan vanop afstand.
WSDL-documenten worden doorgaans niet door ontwikkelaars, maar door applicaties die de service wensen te gebruiken, gelezen.
Wanneer de Web Server een request voor een asmx-bestand ontvangt, genereert deze een testpagina voor de webservice. Vanuit deze pagina kunnen we de functionaliteiten van de Web Service onder de loep nemen.
Via deze pagina's kan je de WSDL-file ook inkijken (Service Description).
SOAP is een platformonafhankelijk protocol dat XML gebruikt om RPC's te maken, standaard over HTTP.
Elk request en response is verpakt in een SOAP-bericht: een XML-bericht met de informatie die de service nodig heeft om het bericht uit te voeren.
Vaak wordt gesproken over een SOAP-enveloppe.

Het poortnummer kan afwijken, daar de interne Web Server zelf een willekeurig poortnummer toegewezen krijgt bij activatie
Deze URL kan je straks nog wijzigen in de properties van de Web Service
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BMI_app
{
public partial class BMI_gebruiken : Form
{
private LokaleService.BMI srvbmi;
public BMI_gebruiken()
{
InitializeComponent();
}
private void BMI_gebruiken_Load(object sender, EventArgs e)
{
srvbmi = new BMI_app.LokaleService.BMI();
}
private void BtnBerekenBMI_Click(object sender, EventArgs e)
{
LblBmi.Text = srvbmi.BerekenBMI(TxtGewicht.Text, TxtLengte.Text).ToString();
LblBeoordeling.Text = srvbmi.EvalueerBMI(Convert.ToSingle(LblBmi.Text));
}
}
}
BMI_Gerbruiken.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="BMI_gebruiken.aspx.cs" Inherits="BMI_gebruiken" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> Bereken uw Body Mass Index<br /> <br /> <table> <tr> <td style="width: 3px"> Lengte:</td> <td> <asp:TextBox ID="TxtLengte" runat="server"></asp:TextBox></td> </tr> <tr> <td style="width: 3px"> Gewicht:</td> <td> <asp:TextBox ID="TxtGewicht" runat="server"></asp:TextBox></td> </tr> <tr> <td style="width: 3px"> </td> <td> <asp:Button ID="BtnBerekenBMI" runat="server" OnClick="BtnBerekenBMI_Click" Text="BMI" /></td> </tr> <tr> <td style="width: 3px"> BMI:</td> <td> <asp:Label ID="LblBMI" runat="server" BackColor="#FFFFC0" ForeColor="Blue"></asp:Label></td> </tr> <tr> <td style="width: 3px"> Evaluatie:</td> <td> <asp:Label ID="LblEvaluatie" runat="server" BackColor="#FFFFC0" ForeColor="#C00000"></asp:Label></td> </tr> </table> </div> </form> </body> </html> BMI_Gebruiken.aspx.cs using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class BMI_gebruiken : System.Web.UI.Page { private LokaleService.BMI srvbmi; protected void Page_Load(object sender, EventArgs e) { srvbmi = new LokaleService.BMI(); } protected void BtnBerekenBMI_Click(object sender, EventArgs e) { LblBMI.Text = srvbmi.BerekenBMI(TxtGewicht.Text, TxtLengte.Text).ToString(); LblEvaluatie.Text = srvbmi.EvalueerBMI(Convert.ToSingle(LblBMI.Text)); } }
| Type | Beschrijving |
|---|---|
| Primitief datatype | Standaard primitieve types: String, Char, Byte, Boolean, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Guid, Decimal, DateTime (als XML's timeInstant), DateTime (als XML-date), DateTime (als XML-time), and XmlQualifiedName (als XML-QName). |
| Enumeratie | Enumeratietypes, vb. "public enum color { red=1, blue=2 }" |
| Arrays van primitieven / Enums | Arrays van bovenstaande |
| Klassen en Structs | Class en struct types met publieke variabelen en eigenschappen, deze worden geserialiseerd |
| Arrays van Klassen en Structs | Arrays van bovenstaande |
| DataSet | DataSets, of DataSets voorkomend in velden of eigenschappen van klassen / structs |
| Arrays van DataSets | Arrays van bovenstaande |
| XmlNode | XML-codefragmenten |
| Arrays van XmlNodes | Arrays van bovenstaande |
Datatypes.cs using System; using System.Data; using System.Web; using System.Collections; using System.Web.Services; using System.Web.Services.Protocols; public enum Mode { On = 1, Off = 2 } public class Order { public int OrderID; public double Price; } [WebService(Namespace = "http://3ejaar.grad.ivo//")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class DataTypes : System.Web.Services.WebService { [WebMethod] public String SayHello() { return "Hello World!"; } [WebMethod] public String SayHelloName(String name) { return "Hello " + name; } [WebMethod] public int[] GetIntArray() { int[] a = new int[5]; for (int i = 0; i < 5; i++) a[i] = i * 10; return a; } [WebMethod] public Mode GetMode() { return Mode.Off; } [WebMethod] public Order GetOrder() { Order myOrder = new Order(); myOrder.Price = 34.5; myOrder.OrderID = 323232; return myOrder; } [WebMethod] public Order[] GetOrders() { Order[] myOrder = new Order[2]; myOrder[0] = new Order(); myOrder[0].Price = 34.5; myOrder[0].OrderID = 323232; myOrder[1] = new Order(); myOrder[1].Price = 109.4; myOrder[1].OrderID = 645645; return myOrder; } }
Default.aspx <h4>Datatypes gebruiken met WebServices</h4> <h5>Methoden die een primitief datatype retourneren (String): </h5> <div id="Message1" runat="server"/> <h5>Methoden die een array van een primitief datatype retourneren (String): </h5> <div id="Message2" runat="server"/> <h5>Methoden die een Enum retourneren: </h5> <div id="Message3" runat="server"/> <h5>Methoden die een Class/Struct retourneren: </h5> <div id="Message4" runat="server"/> <h5>Methoden die een array van Classes/Structs retourneren: </h5> <div id="Message5" runat="server"/> Default.aspx.cs using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page { private DataTypeService.DataTypes d; protected void Page_Load(object sender, EventArgs e) { d = new DataTypeService.DataTypes(); Message1.InnerHtml = d.SayHello(); Message1.InnerHtml = Message1.InnerHtml +"<p>" +d.SayHelloName("William"); Message3.InnerHtml = Message3.InnerHtml + d.GetMode(); int[] myIntArray = d.GetIntArray(); String myString = "Inhoud van de Array:<BR>"; for (int i = 0; i < myIntArray.Length; i++) { myString = myString + myIntArray[i] + "<BR>"; } Message2.InnerHtml = Message2.InnerHtml + myString; DataTypeService.Order myOrder = d.GetOrder(); Message4.InnerHtml = Message4.InnerHtml + "<BR>OrderID: " + myOrder.OrderID; Message4.InnerHtml = Message4.InnerHtml + "<BR>Prijs: " + myOrder.Price; DataTypeService.Order[] myOrders = d.GetOrders(); for (int i = 0; i < myOrders.Length; i++) { if (i > 0) { Message5.InnerHtml += "<BR>"; } Message5.InnerHtml += "<BR>Order#: " + i; Message5.InnerHtml += "<BR>OrderID: " + myOrders[i].OrderID; Message5.InnerHtml += "<BR>Prijs: " + myOrders[i].Price; } } }
Toepassing: Filmdatabase
Maak een databasegestuurde Web-Applicatie voor het bekijken van de gegevens uit een filmdatabase:
Movie.zip
Vereisten:
| Meer tutorials: |
| leer ook: | html | | xhtml | | css | | asp | | asp.net | | c# | | ado.net | | linq | | ajax | | java | | javascript |