You are on page 1of 160

Dynamic Web Pages with ASP.

NET

ASP.NET
Successor of Active Server Pages (ASP), but with a completely different architecture:
object-oriented event-based allows rapid application development (RAD) rich library of GUI elements (web controls) users can define their own GUI elements separation of layout (HTML) and logic (C#) efficient (compiled server scripts) automatic state management authorisation / authentication ...

ASP.NET
Simple Dynamic Web Pages Web Forms Event Handling Web Controls Validators User Controls Custom Controls State Management Configuration of ASP.NET Working with Visual Studio .NET

Static Web Pages


Pure HTML
My.html
Request("My.html")

Browser

<html> <head> <title>Simple HTML page</title> </head> <body> <h1>Welcome</h1> You are visitor number 1! </body> </html>

Response(My.html)

Server (IIS)

My.html

Dynamic ASPX Pages


Computed values can be inserted into HTML code
<%@ Page Language="C#" %> <%@ Import Namespace="System.IO" %> <html> <head> <title>Page counter</title> </head> <body> <h1>Welcome</h1> You are visitor number <% FileStream s = new FileStream("c:\\Data\\Counter.dat", FileMode.OpenOrCreate); int n; try { BinaryReader r = new BinaryReader(s); n = r.ReadInt32(); } catch { n = 0; } // if the file is empty n++; s.Seek(0, SeekOrigin.Begin); BinaryWriter w = new BinaryWriter(s); w.Write(n); s.Close(); Response.Write(n); %> ! </body> </html> Counter.aspx must be in a virtual directory.
Counter.aspx

Creating a Virtual Directory


(under Windows 2000) Steps for creating a virtual directory Control Panel > Administrative Tools > Computer Management right-click on Default Web Site > New ... Virtual Directory follow the dialog

All aspx files must be in a virtual directory


accessible as http://<site-url>/<virtualDirName>/myfile.aspx

Working of ASPX
client (browser)

request ("Counter.aspx")

response (*.html) "Counter.aspx"

ASP.NET

Counter.aspx

preprocessor, compiler
page class Lader

server (IIS)

*.html

page object

.NET framework
7

HTML Code Returned by the Server


Counter.aspx
<%@ Page Language="C#" %> <%@ Import Namespace="System.IO" %> <html> <head><title>Page Counter</title></head> <body> <h1>Welcome</h1> You are visitor number <% FileStream s = new FileStream(...); ... Response.Write(n); %> ! </body> </html>

Returned HTML code


<html> <head><title>Page counter</title></head> <body> <h1>Welcome</h1> You are visitor number 6 ! </body> </html>

does not contain any script code any browser can display this HTML

Code in Script Tags


<%@ Page Language="C#" %> Counter.aspx <%@ Import Namespace="System.IO" %> <html> <head> <title>Page counter</title> <script Language="C#" Runat="Server"> int CounterValue() { FileStream s = new FileStream("c:\\Data\\Counter.dat", FileMode.OpenOrCreate); ... n = r.ReadInt32(); n++; ... return n; } </script> </head> <body> <h1>Welcome</h1> You are visitor number <%=CounterValue()%> ! </body> </html>

short form for

Response.Write(CounterValue());
9

Code Behind
Counter.aspx
<%@ Page Language="C#" Inherits="CounterPage" Src="CounterPage.cs" %> <html> <head> <title>Page counter</title> </head> <body> <h1>Welcome</h1> You are visitor number <%=CounterValue()%> ! </body> </html>

CounterPage.cs
using System.IO; public class CounterPage : System.Web.UI.Page { public int CounterValue() { FileStream s = new FileStream("c:\\Data\\Counter.dat", FileMode.OpenOrCreate); ... n = r.ReadInt32(); n++; ... return n; } }
10

Generated Page Class


System.Web.UI.Page

aspx page
<%@ Page Language="C#"%> <html> <body> ... <%= ... %>... </body> </html>

Counter.aspx

Counter_aspx ...

11

Generated Page Class


System.Web.UI.Page Code behind
CounterPage.cs

public class CounterPage : System.Web.UI.Page { public int CounterValue() { ... } }

CounterPage CounterValue()

aspx page

Counter.aspx

<%@ Page ... Inherits="CounterPage"%> <html> <body> ... <%=CounterValue()%>... </body> </html>

Counter_aspx ...

12

Generated Class Counter_aspx


namespace ASP { using System.IO; ... public class Counter_aspx : CounterPage { private static bool __initialized = false; private static ArrayList __fileDependencies; public Counter_aspx() { ArrayList dependencies; if ((__initialized == false)) { ... } } public override string TemplateSourceDirectory { get { return "/Samples"; } } private void __BuildControlTree(Control __ctrl) { __ctrl.SetRenderMethodDelegate(new RenderMethod(this.__Render__control1)); } private void __Render__control1(HtmlTextWriter __output, Control parameterContainer) { __output.Write("\r\n<html>\r\n\t<head> <title>Page counter</title> </head>\r\n\t<body>\r\n\t\t" + "<h1>Welcome</h1>\r\n\t\tYou are visitor number "); __output.Write(CounterValue()); __output.Write(" !\r\n\t</body>\r\n</html>\r\n"); } protected override void FrameworkInitialize() { __BuildControlTree(this); this.FileDependencies = __fileDependencies; this.EnableViewStateMac = true; this.Request.ValidateInput(); } ... } }

13

ASP.NET
Simple Dynamic Web Pages Web Forms Event Handling Web Controls Validators User Controls Custom Controls State Management Configuration of ASP.NET Working with Visual Studio .NET

... <body> <form action="http://www.fake.com/cgi-bin/myprog" method="post"> <b>Balance:</b> <input type="text" name="total" readonly value="0"> Euro<br> <input type="text" name="amount"> <input type="submit" name="ok" value="Pay"> </form> </body>

HTML Forms (With CGI Scripts)

CGI script myprog


- reads total and amount - sends back a new HTML text in which total and amount have new values

Problems
- CGI programming is tedious - restricted to HTML elements - must manage the state of text fields manually when the page is sent back

15

Web Forms in ASP.NET


Adder.aspx <%@ Page Language="C#" Inherits="AdderPage" Src="Adder.aspx.cs"%> <html> <head><title>Account</title></head> <body> <form method="post" Runat="server"> <b>Balance:</b> <asp:Label ID="total" Text="0" Runat="server"/> Euro<br><br> <asp:TextBox ID="amount" Runat="server"/> <asp:Button ID="ok" Text="Enter" Runat="server" /> </form> </body> </html>

16

Web Forms in ASP.NET


Adder.aspx <%@ Page Language="C#" Inherits="AdderPage" Src="Adder.aspx.cs"%> <html> <head><title>Account</title></head> <body> <form method="post" Runat="server"> <b>Balance:</b> <asp:Label ID="total" Text="0" Runat="server"/> Euro<br><br> <asp:TextBox ID="amount" Runat="server"/> <asp:Button ID="ok" Text="Enter" OnClick="ButtonClick" Runat="server" /> </form> </body> </html> Adder.aspx.cs using System; using System.Web.UI; using System.Web.UI.WebControls; public class AdderPage : Page { protected Label total; protected TextBox amount; protected Button ok; public void ButtonClick (object sender, EventArgs e) { int totalVal = Convert.ToInt32(total.Text); int amountVal = Convert.ToInt32(amount.Text); total.Text = (totalVal + amountVal).ToString(); }

17

HTML Sent by the Server


Counter.aspx
<%@ Page Language="C#" Inherits="AdderPage" Src="Adder.aspx.cs"%> <html> <head><title>Account</title></head> <body> <form method="post" Runat="server"> <b>Balance:</b> <asp:Label ID="total" Text="0" Runat="server"/> Euro<br><br> <asp:TextBox ID="amount" Runat="server"/> <asp:Button ID="ok" Text="Enter" OnClick="ButtonClick" Runat="server" /> </form> </body> </html>

Zurckgesandtes HTML
<html> <head> <title>Account</title> </head> <body> <form name="_ctl0" method="post" action="Adder.aspx" id="_ctl0"> <input type="hidden" name="__VIEWSTATE" value="dDwxNTg0NTEzNzMyO3Q8O2w8aTwxP" + "js+O2w8dDw7bDxpPDE+Oz47bDx0PHA8cDxs"+ "PFRleHQ7PjtsPDEwMDs+Pjs+Ozs+Oz4+Oz4+" + "Oz7uOgbDI3uKWY/X5D1Fw8zmjTZkwg==" /> <b>Balance:</b> <span id="total">100</span> Euro<br><br> <input type="text" name="amount" value="100" id="amount" /> <input type="submit" name="ok" value="Enter" id="ok" /> </form> </body> </html>
18

General Notation for Web Controls


<asp:ClassName PropertyName="value" ... Runat="server" />

Example
<asp:Label ID="total" Text="Hello" ForeColor="Red" Runat="server" /> public class Label: WebControl { public virtual string ID { get {...} set {...} } public virtual string Text { get {...} set {...} } public virtual Color ForeColor { get {...} set {...} } ... } All web control classes are in the namespace System.Web.UI

Alternative Notation
<asp:Label ID="total" ForeColor="Red" Runat="server" > Hello </asp:Label>
19

Advantages of Web Forms

The page is an object

one can access all its properties and methods: page.IsPostBack, page.User, page.FindControl(), ...

All GUI elements are objects

one can access all their properties and methods: amount.Text, amount.Font, amount.Width, ...

One can implement custom GUI elements

Web pages can access the whole .NET library


databases, XML, RMI, ...

The state of all GUI elements is retained

amount.Text does not need to be set before the page is sent back
20

Web Controls (selection)


abc

Calendar

Label TextBox
DataGrid ...

Button
RadioButton CheckBox DropDownLis

User Controls Custom Controls

21

Web Control Hierarchy


Control
ID Page Visible

WebControl
Font Width Height

TemplateControl

...

Button
Text

TextBox
Text Rows Columns

Label
Text

...

Page
Request Response IsPostBack

UserControl

...

22

ASP.NET
Simple Dynamic Web Pages Web Forms Event Handling Web Controls Validators User Controls Custom Controls State Management Configuration of ASP.NET Working with Visual Studio .NET

Event-based Processing
mouse click

click event

event handler
void DoClick (object sender, EventArgs e) { ... }

<asp:Button Text="..." OnClick="DoClick" Runat="sever" />

Client

Server

24

Kinds of Events
Control all Event Init Load PreRender Unload When does the event occur? when the control is created after the data that were sent by the browser have been loaded into the control before HTML code for this control is generated before the control is removed from memory

Button TextBox

Click TextChanged

when the button was clicked when the contents of the TextBox changed

CheckBox
ListBox

CheckedChanged
SelectedIndexChange d

when the state of the CheckBox changed


when a new item from the list has been selected
25

Round Trip of a Web Page


round trip event Page

+ page state

Label
TextBox Button

Click

1. Creation create page object and its controls

Client

Server
26

Round Trip of a Web Page


round trip event Page Init

+ page state

Label
TextBox Button

Init Init Init

Click

2. Initialisation - raise Init events

Client

Server
27

Round Trip of a Web Page


round trip event Page Load

+ page state

Label
TextBox Button

Load Load Load

Click

3. Loading - load controls with the values that the user has entered (page state) - raise Load events

Client

Server
28

Round Trip of a Web Page


Page

Label
TextBox Button 4. Action handle event(s) (Click, TextChanged, ...)

Client

Server
29

Round Trip of a Web Page


Page PreRender

Label
HTML
<html> ... <input type="text" ...> <input type="button" ...> ... </html>

PreRender PreRender PreRender

TextBox Button

+ page state 5. Rendering - raise PreRender events - call Render methods of all controls, which render the controls to HTML

Client

Server
30

Round Trip of a Web Page


Page Unload

Label
TextBox
<html> ... <input type="text" ...> <input type="button" ...> ... </html>

Unload Unload Unload

Button

6. Unloading - raise Unload events for cleanup actions

Client

Server
31

Events Causing Round Trip


Round trip events (cause an immediate round trip)
Click <asp:Button Text="click me" Runat="server" OnClick="DoClick" />

Delayed events (are handled at the next round trip)


TextChanged SelectedIndexChanged <asp:TextBox Runat="server" OnTextChanged="DoTextChanged" />

<asp:ListBox Rows="3" Runat="server" OnSelectedIndexChanged="DoSIChanged" />

AutoPostBack (causes a delayed event to lead to an immediate round trip)


TextChanged

<asp:TextBox Runat="server" AutoPostBack="true" OnTextChanged="DoTextChanged" />


32

ASP.NET
Simple Dynamic Web Pages Web Forms Event Handling Web Controls Validators User Controls Custom Controls State Management Configuration of ASP.NET Working with Visual Studio .NET

Web Control Hierarchy


Control WebControl Button TextBox Label BaseValidator ... CheckBox RadioButton ListControl ListBox DropDownList Image ImageButton Calendar ValidationSummary ... TemplateControl Page UserControl
34

Class Control
public class Control: ... { public virtual string ID { get; set; } public virtual ControlCollection Controls { get; } public virtual Control Parent { get; } public virtual Page Page { get; set; } public virtual bool Visible { get; set; } protected virtual StateBag ViewState { get; } public virtual bool EnableViewState { get; set; } ... public virtual bool HasControls(); public virtual Control FindControl (string id); public virtual void DataBind(); protected virtual void LoadViewState (object state); protected virtual object SaveViewState(); protected virtual Render (HtmlTextWriter w); ... public event EventHandler Init; public event EventHandler Load; public event EventHandler DataBinding; public event EventHandler PreRender; public event EventHandler Unload; ... }
35

Properties name of the control nested controls enclosing control page to which the control belongs should the control be visible? state of this control (see later) should the state be persistent? Methods does the control have nested controls? searches for a nested control with the name id loads data from a data source loads the state from the request stream saves the state to the response stream renders the control to HTML Events after the control was created after the state was loaded from the request after DataBind was called before the control is rendered to HTML before the control is released

Properties of Class Control


Containment relationship
Page
Controls Button

ListBox

TextBox

Page

Controls

Parent

Page

ListItem ListItem ListItem

ViewState
public void ButtonClick (object Button, EventArgs e) { int clicks = ViewState["nClicks"] == null ? 0 : (int) ViewState["nClicks"]; ViewState["nClicks"] = ++clicks; }

programmers can store arbitrary data in ViewState ViewState is stored in a hidden field of the HTML page this here is the ViewState of Page (ViewState of Button is protected)

36

Class WebControl
public class WebControl: Control { public virtual Unit Width { get; set; } public virtual Unit Height { get; set; } public virtual FontInfo Font { get; set; } public virtual Color ForeColor { get; set; } public virtual Color BackColor { get; set; } public virtual Unit BorderWidth { get; set; } public virtual Color BorderColor { get; set; } public virtual BorderStyle BorderStyle { get; set; } public virtual bool Enabled { get; set; } public virtual short TabIndex { get; set; } public virtual string ToolTip { get; set; } ... }

Units of Measurement
public struct Unit { public Unit (double value, UnitType type); public double Value { get; } public UnitType Type { get; } ... } public enum UnitType {Cm, Em, Ex, Inch, Mm, Percentage, Pica, Pixel, Point }

setting properties in a web page: default: Pixel


<asp:TextBox ID="tb" Width="100" ... /> <asp:TextBox ID="tb" Width="10cm" ... /> <asp:TextBox ForeColor="Red" ... />

Colors

namespace: System.Drawing

public struct Color { public static Color Blue { get; } public static Color Red { get; } public static Color Yellow { get; } ... public static Color FromArgb (int R, int B, int G); }

setting properties in the script code:


tb.Width = 100; // default: Pixel tb.Width = new Unit(10, UnitType.Cm); tb.ForeColor = Color.Red;

37

WebControl (Fonts)
Fonts
public sealed class FontInfo { public string Name { get; set; } public FontUnit Size { get; set; } public bool Bold { get; set; } public bool Italic { get; set; } public bool Underline { get; set; } ... } public struct FontUnit { public FontUnit (Unit size); public FontUnit (FontSize size); public Unit Unit { get; } public FontSize Type { get; } ... } public enum FontSize { AsUnit, XSmall, Small, Medium, Large, XLarge, ... }

setting the font in a web page:


<asp:Button ID="b1" Font-Name="Arial" Font-Size="Large" Font-Bold="true" .../> <asp:Button ID="b2" Font-Name="Times" Font-Size="12px" Font-Italic="true" ... />

setting the font in the script code:


b1.Font.Name = "Arial"; b1.Font.Size = new FontUnit(FontSize.Large); b1.Font.Bold = true; b2.Font.Name = "Times"; b2.Font.Size = new FontUnit(12); b2.Font.Italic = true;

38

WebControl (Other Properties)


BorderStyle
public enum BorderStyle { NotSet, None, Dotted, Dashed, Solid, Double, Groove, Ridge, Inset, OutSet }

Enabled
<asp:Button Enabled="false" ... />

displays the control, but deactivates it

TabIndex
<asp:TextBox TabIndex="3" ... /> <asp:TextBox TabIndex="2" ... /> <asp:TextBox TabIndex="1" ... />

TAB

TAB

sequence in which the controls are visited when the TAB key is pressed

39

Class Button
public class Button: WebControl { //--- properties public string Text { get; set; } public string CommandName { get; set; } public string CommandArgument { get; set; } public bool CausesValidation { get; set; } //--- events public event EventHandler Click; public event CommandEventHandler Command; }

caption of the button for handling Command events. should the validators run when the page is sent to the server? default = true

<asp:Button Text="click me" OnClick="DoClick" Runat="server" />

public void DoClick (object sender, EventArgs e) { ... }

delegate EventHandler either in the code behind or in <script> tags of the page

40

Button (Command Event)


Command Event
useful is multiple buttons on a page should be handled by the same event handler
<form Runat="server"> <asp:Label ID="label" Text="100.00" Runat="server" /> <br><br> <asp:Button Text="+ 10%" CommandName="add" CommandArgument="0.1" OnCommand="DoCommand" Runat="server" /> <asp:Button Text="- 5%" CommandName="sub" CommandArgument="0.05" OnCommand="DoCommand" Runat="server" /> </form> public void DoCommand (object sender, CommandEventArgs e) { double total = Convert.ToDouble(label.Text); if (e.CommandName == "add") total += total * Convert.ToDouble(e.CommandArgument); else if (e.CommandName == "sub") total -= total * Convert.ToDouble(e.CommandArgument); label.Text = total.ToString("f2"); }
41

Class TextBox
public class TextBox: WebControl { //--- properties public virtual string Text { get; set; } public virtual TextBoxMode TextMode { get; set; } public virtual int MaxLength { get; set; } public virtual int Columns {get; set; } public virtual int Rows { get; set; } public virtual bool Wrap { get; set; } public virtual bool ReadOnly { get; set; } public virtual bool AutoPostBack { get; set; } //--- events public event EventHandler TextChanged; } <asp:TextBox Text="sample" Runat="server" /> <asp:TextBox TextMode="Password" MaxLength="10" Runat="server" /> public enum TextBoxMode { MultiLine, Password, SingleLine }

true: TextChanged causes an immediate round trip raised when the RETURN key is pressed or when the cursor leaves the TextBox

<asp:TextBox TextMode="MultiLine" Rows="2" Columns="15" Wrap="true" Runat="server" /> line 1 line 2 line 3 </asp:TextBox>

42

Class CheckBox
public class CheckBox: WebControl { //--- properties public virtual bool Checked { get; set; } public virtual string Text { get; set; } public virtual TextAlign TextAlign { get; set; } public virtual bool AutoPostBack { get; set; } //--- events public event EventHandler CheckedChanged; } public enum TextAlign { Left, Right }

raised when Checked changes

<form Runat="server"> <asp:CheckBox ID="apples" Text="Apples" Runat="server" /><br> <asp:CheckBox ID="pears" Text="Pears" Runat="server" /><br> <asp:CheckBox ID="bananas" Text="Bananas" Runat="server" /><br> <asp:Button Text="Buy" OnClick="DoClick" Runat="server" /> <br><br> <asp:Label ID="label" Runat="server" /> </form> void DoClick (object sender, EventArgs e) { label.Text = "You bought: "; if (apples.Checked) label.Text += "Apples "; if (pears.Checked) label.Text += "Pears "; if (bananas.Checked) label.Text += "Bananas "; }

43

Class RadioButton
public class RadioButton: CheckBox { public virtual string GroupName { get; set; } }

all radio buttons of the same group must have the same group name

<form Runat="server"> <p>Select method of payment:</p> <asp:RadioButton ID="cash" Text="cash" GroupName="payment" OnCheckedChanged="RadioChanged" AutoPostBack="true" Runat="server" /><br> <asp:RadioButton ID="cheque" Text="cheque" GroupName="payment" OnCheckedChanged="RadioChanged" AutoPostBack="true" Runat="server" /><br> <asp:RadioButton ID="card" Text="credit card" GroupName="payment" OnCheckedChanged="RadioChanged" AutoPostBack="true" Runat="server" /><br><br> <asp:Label ID="label" Runat="server" /> </form> void RadioChanged (object sender, EventArgs e) { label.Text = "Method of payment: "; if (cash.Checked) label.Text += cash.Text; if (cheque.Checked) label.Text += cheque.Text; if (card.Checked) label.Text += card.Text; }

44

Class ListControl
Base class of ListBox, DropDownList, ...
public class ListControl: WebControl { //--- properties public virtual ListItemCollection Items { get; set; } public virtual ListItem SelectedItem { get; } public virtual int SelectedIndex { get; set; } public virtual string DataTextFormatString { get; set; } public virtual object DataSource { get; set; } public virtual string DataTextField { get; set; } public virtual string DataValueField { get; set; } public virtual bool AutoPostBack { get; set; } //--- events public event EventHandler SelectedIndexChanged; } public sealed class ListItem { public string Text { get; set; } public string Value { get; set; } public bool Selected { get; set; } }

-1 or 0, 1, 2, 3, ... e.g. "width = {0,f2} cm"

raised when a new ListItem is selected

DataSource
DataTextField

arbitrary object that implements ICollection (DataView, Array, ArrayList, SortedList, ...)
for DataView: name of the column that contains the text to be displayed

DataValueField for DataView: name of the column that contains the value which corrsponds to the displayed text
45

Class ListBox
public class ListBox: ListControl { public virtual int Rows { get; set; } public virtual ListSelectionMode SelectionMode { get; set; } } public enum ListSelectionMode { Single, Multiple }

statically specified list


<form Runat="server"> <asp:ListBox ID="list" Rows="3" Runat="server" > <asp:ListItem Text="United States" Value="USA" Runat="server" /> <asp:ListItem Text="Great Britain" Value="GB" Runat="server" /> <asp:ListItem Text="Germany" Value="D" Runat="server" /> <asp:ListItem Text="France" Value="F" Runat="server" /> <asp:ListItem Text="Italy" Value="I" Runat="server" /> </asp:ListBox><br><br> <asp:Button OnClick="ButtonClick" Text="Show" Runat="server" /><br> <asp:Label ID="lab" Runat="server" /> </form>

void ButtonClick (object sender, EventArgs e) { lab.Text = "The selected country has the international car code "; if (list.SelectedItem != null) lab.Text += list.SelectedItem.Value; }
46

ListBox (Dynamically Specified List)


<form Runat="server"> <asp:ListBox ID="list" Rows="3" AutoPostBack="true" OnSelectedIndexChanged="Show" Runat="server" /> <br><br> <asp:Button Text="Fill" OnClick="Fill" Runat="server" /> <br><br> <asp:Label ID="lab" Runat="server" /> </form> void Fill (object sender, EventArgs e) { SortedList data = new SortedList(); data["United States"] = "USA"; data["Great Britain"] = "GB"; data["France"] = "F"; data["Italy"] = "I"; list.DataSource = data; list.DataTextField = "Key"; // take the text from the Key property of the items list.DataValueField = "Value"; // take the value from the Value property of the items list.DataBind(); } void Show (object sender, EventArgs e) { lab.Text = "The selected country has the international car code "; if (list.SelectedItem != null) lab.Text += list.SelectedItem.Value; }
47

ListBox (Even Simpler)


If Text and Value are equal, one can use the followin simple solution
<form Runat="server"> <asp:ListBox ID="list" Rows="3" AutoPostBack="true" OnSelectedIndexChanged="Show" Runat="server" /> <br><br> <asp:Button Text="Fill" OnClick="Fill" Runat="server" /> <br><br> <asp:Label ID="lab" Runat="server" /> </form> void Fill (object sender, EventArgs e) { list.DataSource = new string[] {"D", "F", "GB", "I", "USA"}; list.DataBind(); } void Show (object sender, EventArgs e) { lab.Text = "The selected country has the international car code "; if (list.SelectedItem != null) lab.Text += list.SelectedItem.Value; }

48

ListBox (List Generated From a


<form OnInit="PageInit" Runat="server"> <asp:ListBox ID="list" DataTextField="LastName" DataValueField="EmployeeID" OnSelectedIndexChanged="HandleSelect" AutoPostBack="true" Runat="server" /><br> <asp:Label ID="label" Runat="server" /> </form> public class BasePage : Page { protected ListBox list; protected Label label; public void PageInit (object sender, EventArgs e) { DataSet ds = new DataSet(); SqlConnection con = new SqlConnection("data source=127.0.0.1\\NETSDK; " + "initial catalog=Northwind; user id=sa; password=; Trusted_Connection=true"); string cmdString = "SELECT * FROM Employees"; SqlDataAdapter adapter = new SqlDataAdapter(cmdString, con); adapter.Fill(ds, "Employees"); if (ds.HasErrors) ds.RejectChanges(); else ds.AcceptChanges(); list.DataSource = ds.Tables["Employees"].DefaultView; list.DataBind(); } public void HandleSelect (object sender, EventArgs e) { label.Text = "employee number = "; if (list.SelectedItem != null) label.Text += list.SelectedItem.Value; } }
49

Database)

Class DropDownList
public class DropDownList: ListControl { // same interface as ListControl }

statically specified DropDownList


<form Runat="server"> <asp:DropDownList ID="list" OnSelectedIndexChanged="HandleSelect" AutoPostBack="true" Runat="server" > <asp:ListItem Text="United States" Value="USA" /> <asp:ListItem Text="Great Britain" Value="GB" /> <asp:ListItem Text="Germany" Value="D" /> <asp:ListItem Text="France" Value="F" /> <asp:ListItem Text="Italy" Value="I" /> </asp:DropDownList><br> <asp:Label ID="lab" Runat="server" /> </form> void HandleSelect (object sender, EventArgs e) { lab.Text = "The selected country has the international car code "; if (list.SelectedItem != null) lab.Text += list.SelectedItem.Value; }

DropDownList can also be filled dynamically (like ListBox)

50

Class DataGrid
public class DataGrid: BaseDataList { //--- properties public virtual object DataSource { get; set; } public virtual bool AutoGenerateColumns { get; set; } public virtual DataGridColumnCollection Columns {get;} public virtual DataGridItemsCollection Items { get; set; } public virtual DataGridItem SelectedItem { get; set; } public virtual int SelectedIndex { get; set; } ... } public class DataGridColumn: ... { public virtual string HeaderText { get; set; } public virtual string FooterText { get; set; } public virtual TableItemStyle HeaderStyle {get;} public virtual TableItemStyle FooterStyle {get;} ... } public class DataGridItem: ... { public virtual TableCellCollection Cells { get; } ... } public class TableCell: WebControl { public virtual string Text { get; set; } public virtual bool Wrap { get; set; } ... }

DataGridColumn

DataGridItem TableCell

51

DataGrid (Formatting)
public class DataGrid: BaseDataList { //--- properties ... public virtual GridLines GridLines { get; set; } public virtual int CellPadding { get; set; } public virtual int CellSpacing { get; set; } public virtual bool ShowHeader { get; set; } public virtual bool ShowFooter { get; set; } public virtual TableItemStyle AlternatingItemStyle { get; } public virtual TableItemStyle HeaderStyle { get; } public virtual TableItemStyle FooterStyle { get; } public virtual TableItemStyle ItemStyle { get; } public virtual TableItemStyle SelectedItemStyle { get; } ... } public class TableItemStyle: Style { public FontInfo Font { get; } public Color ForeColor { get; set; } public Color BackColor { get; set; } public Unit Width { get; set; } public Unit Height { get; set; } ... } public enum GridLines { Both, Horizontal, None, Vertical }

Text

Text

CellPadding

CellSpacing

<asp:DataGrid HeaderStyle-Font-Bold="true" Runat="server"> <ItemStyle ForeColor="Red" Font-Name="Times" /> <AlternatingItemStyle BackColor="LightGray" /> </asp:DataGrid>

52

DataGrid (Methods and Events)


public class DataGrid: BaseDataList { ... //--- methods public override void DataBind(); ... //--- events public event DataGridCommandEventHandler ItemCommand; public event DataGridCommandEventHandler EditCommand; public event DataGridCommandEventHandler CancelCommand; public event DataGridCommandEventHandler UpdateCommand; public event DataGridCommandEventHandler DeleteCommand; public event EventHandler SelectedIndexChanged; }

Events are raised depending on the column kind BoundColumn ButtonColumn EditCommandColumn

53

DataGrid (Column Kind)


BoundColumn
Is automatically bound to a columns of the data source
DataTextField = "dbColumnName"

ButtonColumn

Every line contains a button which raises an ItemCommand


ButtonType = "LinkButton" | "PushButton" Text = "buttonLabel" CommandName = "Select" | "Delete" | "anyText"

CommandName is passed to the ItemCommand

EditCommandColumn Every line contains an edit button. If it is clicked it is replaced


with an update and a cancel button.
ButtonType = "LinkButton" | "PushButton" EditText = "editButtonLabel" UpdateText = "updateButtonLabel" CancelText = "cancelButtonLabel"

54

DataGrid (Event Handling)


Kind of the raised event column kind ButtonColumn condition
CommandName == "Select" CommandName == "Delete" CommandName == arbitrary

raised events
ItemCommand + SelectedIndexChanged ItemCommand + DeleteCommand ItemCommand ItemCommand + EditCommand ItemCommand + UpdateCommand ItemCommand + CancelCommand

EditCommandColumn click on edit button


click on update button click on cancel button

Event parameter of ItemCommand


void HandleItemCommand (object sender, DataGridCommandEventArgs e) {...}

column kind ButtonColumn

e.CommandName
CommandName Edit-Button UpdateButton CancelButton "Edit" "Update" "Cancel"
55

EditCommandColumn

DataGrid (Simple Example)


<form OnInit="PageInit" Runat="server"> <asp:DataGrid ID="grid" Runat="server" /> </form> public class BasePage : Page { protected DataGrid grid; public void PageInit (object sender, EventArgs e) { DataSet ds = new DataSet(); SqlConnection con = new SqlConnection("data source=127.0.0.1\\NETSDK; " + "initial catalog=Northwind; user id=sa; password=; Trusted_Connection=true"); string sqlString = "SELECT EmployeeID, FirstName, LastName FROM Employees"; SqlDataAdapter adapter = new SqlDataAdapter(sqlString, con); adapter.Fill(ds, "Employees"); if (ds.HasErrors) ds.RejectChanges(); else ds.AcceptChanges(); grid.DataSource = ds.Tables["Employees"].DefaultView; grid.DataBind(); grid.HeaderStyle.Font.Bold = true; grid.AlternatingItemStyle.BackColor = System.Drawing.Color.LightGray; } }

56

DataGrid (With ButtonColumn)


<form OnLoad="PageLoad" Runat="server"> <asp:DataGrid ID="grid" Runat="server" AutoGenerateColumns="false" CellPadding="3" HeaderStyle-BackColor="#aaaadd" AlternatingItemStyle-BackColor="LightGray" OnDeleteCommand="DeleteRow" OnSelectedIndexChanged="SelectRow" > <Columns> <asp:BoundColumn HeaderText="ID" DataField="EmployeeID"> <ItemStyle HorizontalAlign="Right" /> </asp:BoundColumn> <asp:BoundColumn HeaderText="First Name" DataField="FirstName" /> <asp:BoundColumn HeaderText="Last Name" DataField="LastName" /> <asp:ButtonColumn ButtonType="LinkButton" Text="delete" CommandName="Delete" /> <asp:ButtonColumn ButtonType="LinkButton" Text="select" CommandName="Select" /> </Columns> </asp:DataGrid><br> <asp:Label ID="label" Runat="server" /> </form>

57

DataGrid (Code Behind)


public class BasePage: Page { protected DataGrid grid; protected Label label; DataView dataView; public void PageLoad (object sender, EventArgs e) { DataSet ds; if (!IsPostBack) { ... // load ds from the database Session["Data"] = ds; } else ds = (DataSet)Session["Data"]; dataView = ds.Tables["Employees"].DefaultView; grid.DataSource = dataView; grid.DataBind(); } public void DeleteRow (object sender, DataGridCommandEventArgs e) { dataView.Delete(e.Item.DataSetIndex); // deletes data only in the DataSet grid.DataSource = dataView; // but not in the database grid.DataBind(); } public void SelectRow (object sender, EventArgs e) { grid.SelectedItemStyle.BackColor = System.Drawing.Color.Gray; label.Text = grid.SelectedItem.Cells[1].Text + " " + grid.SelectedItem.Cells[2].Text; } }
58

ASP.NET
Simple Dynamic Web Pages Web Forms Event Handling Web Controls Validators User Controls Custom Controls State Management Configuration of ASP.NET Working with Visual Studio .NET

Validators
Objects for plausibility checks
Label

BaseValidator

RequiredFieldValidator checks if a text field is empty

BaseCompareValidator

CustomValidator does a user-defined check

RangeValidator

CompareValidator

checks if the value of a text field is in a valid range

compares the values of two text fields

60

Validators (Example)
Name: <asp:TextBox ID="name" Runat="server" /> <asp:RequiredFieldValidator ControlToValidate="name" Text="*" ErrorMessage="You must enter a name" Runat="server" /> <br> Age: <asp:TextBox ID="age" Runat="server" /> <asp:RangeValidator ControlToValidate="age" Text="*" MinimumValue="0" MaximumValue="100" Type="Integer" ErrorMessage="The age must be between 0 and 100" Runat="server" /> <asp:Button Text="Submit" OnClick="DoClick" Runat="server" /> <asp:ValidationSummary Runat="server" />

61

ASP.NET
Simple Dynamic Web Pages Web Forms Event Handling Web Controls Validators User Controls Custom Controls State Management Configuration of ASP.NET Working with Visual Studio .NET

User Controls (Example)


Group of controls that can be used like a single control

Described in an ascx file (e.g. MoneyField.ascx)


<%@ Control Inherits="MoneyFieldBase" Src="MoneyField.ascx.cs" %> <asp:TextBox ID="amount" Runat="server" /> <asp:DropDownList ID="currency" AutoPostBack="true" OnSelectedIndexChanged="Select" Runat="server"> <asp:ListItem Text="Euro" Value="1.0" Selected="true" /> <asp:ListItem Text="Dollars" Value="0.88" /> <asp:ListItem Text="Fracs" Value="1.47" /> <asp:ListItem Text="Pounds" Value="0.62" /> </asp:DropDownList>

63

User Controls (Code Behind)


MoneyField.ascx.cs using System; using System.Web.UI; using System.Web.UI.WebControls; public class MoneyFieldBase : UserControl { protected TextBox amount; protected DropDownList currency; public string Text { get { return amount.Text; } set { amount.Text = value; } } public double OldFactor { get { return ViewState["factor"] == null ? 1 : (double)ViewState["factor"]; } set { ViewState["factor"] = value; } } public void Select (object sender, EventArgs arg) { try { double val = Convert.ToDouble(amount.Text); double newFactor = Convert.ToDouble(currency.SelectedItem.Value); double newVal = val / OldFactor * newFactor; amount.Text = newVal.ToString("f2"); OldFactor = newFactor; } catch (Exception) { amount.Text = "0"; } } }
64

User Controls (Usage)


Multiple instances of them can be used on the <%@ Page Language="C#" %> same page <%@ Register TagPrefix="my" TagName="MoneyField" Src="MoneyField.ascx" %>
<html> <body> <form Runat="server"> Amount 1: <my:MoneyField ID="field1" Text="100" Runat="server" /><br> Amount 2: <my:MoneyField ID="field2" Runat="server" /> </form> </body> </html>>

65

ASP.NET
Simple Dynamic Web Pages Web Forms Event Handling Web Controls Validators User Controls Custom Controls State Management Configuration of ASP.NET Working with Visual Studio .NET

Custom Controls (Example)


Allow you to implement completely new functionality (e.g. text folding)

Must be implemented as a (direct or indirect) subclass of Control


Control foreground text: background text: Click event: property Fold.Text property ImageButton.AlternateText inherited from ImageButton

WebControl
ImageButton Fold

must override the Render method, which translates this control to HTML
67

Custom Controls (Example: Class


using System; using System.Web.UI; using System.Web.UI.WebControls; namespace Folds { // custom controls must be declared in a namespace public class Fold : ImageButton { public string Text { get { return ViewState["Text"]==null ? "" : (string)ViewState["Text"]; } set { ViewState["Text"] = value; } } public string Icon { get { return ViewState["Icon"]==null ? "Solid" : (string)ViewState["Icon"]; } set { ViewState["Icon"] = value; } } public Fold() : base() { Click += new ImageClickEventHandler(FoldClick);} void FoldClick (object sender, ImageClickEventArgs e) { string s = Text; Text = AlternateText; AlternateText = s; // AlternateText from ImageButton if (Icon == "Solid") Icon = "Hollow"; else Icon = "Solid"; } protected override void Render (HtmlTextWriter w) { w.Write("<input type=image name=" + this.UniqueID); w.Write(" src='" + TemplateSourceDirectory + "/" + Icon + "Left.gif' border=0 />"); w.Write(Text); w.Write("<img src='" + TemplateSourceDirectory + "/" + Icon + "Right.gif'>"); } } }
68

Fold)

SolidLeft.gif SolidRight.gif HollowLeft.gif HollowRight.gif

Custom Controls (Usage)


Must be compiled into a DLL, which has to be stored in the \bin directory
csc /target:library /out:bin/Fold.dll Fold.cs

Used as follows
<%@ Page Language="C#" %> <%@ Register TagPrefix="my" Namespace="Folds" Assembly="Fold" %> <html> <body> <form Runat="server"> <my:Fold Text="..." AlternateText="..." Runat="server" /> </form> </body> </html>

69

ASP.NET
Simple Dynamic Web Pages Web Forms Event Handling Web Controls Validators User Controls Custom Controls State Management Configuration of ASP.NET Working with Visual Studio .NET

3 Kinds of States
Page state
e.g. contents of TextBoxes, state of CheckBoxes, ...

Session state

(session = all requests from the same client within a certain time) e.g. shopping cart, email address of a client, ...
(Application = all aspx files in the same application
/Samples x.aspx session state session S e r v e r y.aspx z.aspx application state

Application state
i e n t response + page state

virtual directory) session request + page state C e.g. configuration data, number of sessions, ... l

C l i e n t

session state
71

How to Access State Information


Page state
writing: reading: ViewState["counter"] = counterVal; int counterVal = (int) ViewState["counter"];

Session state
writing: reading: Session["cart"] = shoppingCart; DataTable shoppingCart = (DataTable) Session["cart"];

Application state
writing: reading: Application["database"] = databaseName; string databaseName = (string) Application["databaseName"];

ViewState, Session and Application are properties of the Page class

72

Class Page
public class Page: TemplateControl { //--- properties public ValidatorCollection Validators { get; } public bool IsValid { get; } public bool IsPostBack { get; } public virtual string TemplateSourceDirectory { get; } public HttpApplicationState Application { get; } public virtual HttpSessionState Session { get; } public HttpRequest Request { get; } public HttpResponse Response { get; } ... //--- methods public string MapPath(string virtualPath); public virtual void Validate(); ... }

IsValid true, if none of the validators on the page reported an error IsPostBack true, if the page was sent to the server in a round trip. If the page was requested for the first time
IsPostBack == false

TemplateSourceDirectory current virtual directory, z.B. "/Samples" Application and Session application state and session state Request und Response HTTP request and HTTP response

MapPath(virtPath) maps the virtual directory to the physical one Validate() starts all validators on the page

73

Class HttpRequest
public class HttpRequest { public string UserHostName { get; } public string UserHostAddress { get; } public string HttpMethod { get; } public HttpBrowserCapabilities Browser { get; } public NameValueCollection Form { get; } public NameValueCollection QueryString { get; } public NameValueCollection Cookies { get; } public NameValueCollection ServerVariables { get; } ... }

UserHostName domain name of the client UserHostAddress IP number of the client

<body> <%= "address = " + Request.UserHostAddress %><br> <%= "method = " + Request.HttpMethod %><br> <%= "browser = " + Request.Browser.Browser %><br> <%= "version = " + Request.Browser.Version %><br> <%= "supports JS = " + Request.Browser.JavaScript %><br> <%= "server = " + Request.ServerVariables["SERVER_SOFTWARE"] %> </body>

address = 127.0.0.1 method = GET browser = IE version = 6.0 supports JS = True server = Microsoft-IIS/5.0

74

HttpRequest (Request and Form


<form Runat="server"> <asp:TextBox ID="text1" Runat="server" /><br> <asp:TextBox ID="text2" Runat="server" /><br> <asp:CheckBox ID="checkbox" Text="box" Runat="server" /><br> <asp:Button ID="button" Text="Send" OnClick="DoClick" Runat="server" /> <asp:Label ID="lab" Runat="server" /> </form> void DoClick (object sender, EventArgs e) { lab.Text = "Query string<br>"; foreach (string par in Request.QueryString.Keys) lab.Text += par + " = " + Request.QueryString[par] + "<br>"; lab.Text += "<br>Form parameters<br>"; foreach (string par in Request.Form.Keys) lab.Text += par + " = " + Request.Form[par] + "<br>"; }

Parameters)

Query string par1 = 123 par2 = Hello Form parameters __VIEWSTATE = dDwxMTYxMTk1 ... text1 = John text2 = Miller checkbox = on button = Send

75

Class HttpResponse
public class HttpResponse { //--- properties public string ContentType { get; set; } public TextWriter Output { get; } public int StatusCode { get; set; } public HttpCookieCollection Cookies { get; set; } ... //--- methods public void Write(string s); // various overloaded versions public void Redirect(string newURL); ... }

ContentType MIME type (e.g. text/html) Output HTML response stream; can be written to with Write StatusCode e.g. 200 for "ok" or 404 for "page not found"

Test1.aspx
<form Runat="server"> Name: <asp:TextBox ID="name" Runat="server" /> <asp:Button Text="Send" OnClick="DoClick" Runat="server" /> </form> void DoClick (object sender, EventArgs e) { Response.Redirect("Welcome.aspx?name=" + name.Text); }

Welcome.aspx
Welcome <%= Request.QueryString["name"] %> !
76

ASP.NET
Simple Dynamic Web Pages Web Forms Event Handling Web Controls Validators User Controls Custom Controls State Management Configuration of ASP.NET Working with Visual Studio .NET

machine.config and web.config


CONFIG ... machine.config App1 x.aspx y.aspx web.config App2 a.aspx b.aspx subdir web.config

subdir c.aspx web.config

virtual directories

machine.config
web.config

global configuration file stored in the .NET Framework directory


specific configuration file stored in a virtual directory or in its subdirectories overwrites configurations from machine.config or from other configuration files further up the hierarchy

Configuration files are written in XML


78

web.config

Example: Application Parameters

<?xml version="1.0" encoding="UTF-8"?> <configuration> <appSettings> <add key="author" value="hm" /> <add key="organisation" value="JKU" /> </appSettings> ... </configuration>

Can be accessed in ASP.NET pages


<%@Page Language="C#" %> <%@ Import Namespace="System.Configuration" %> <html> <body> <%= "author = " + ConfigurationSettings.AppSettings["author"] %><br> <%= "organisation = " + ConfigurationSettings.AppSettings["organisation"] %><br> </body> </html>

79

Example: Tracing
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.web> <trace enabled="true" pageOutput="true" /> ... </system.web> ... </configuration>

Gives detailed error diagnostics

Shows a trace if the page is correct

80

Authorisation
Who may visit the pages of a specific directory?
The directory must have a web.config file with the following contents
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.web> <authorization> <allow users="admin" /> <deny users="?" /> </authorization> ... </system.web> ... </configuration>

users="user1, user2, ..."


* ? name all users anonymous users users who have authenticated themselves with this name

machine.config contains
<allow users="*" />

This is default if no <allow ...> is specified

81

Authentication
4 kinds
None No authentication. All users are anonymous. Uses the login name and the password of the Windows login. Makes only sense for local servers. Users are redirected to the login page of the Passport server where they can authenticate themselves (with their user name and password). Users are authenticated by a custom login page.

Windows

Passport

Forms

82

Forms Authentication
web.config

(Configuration)

<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.web> <authorization> <deny users="?" /> </authorization> <authentication mode="Forms"> <forms loginUrl="Login.aspx" name="mycookie" protection="All" timeout="20"> <credentials passwordFormat="MD5"> <user name="peter" password="85C69322756E01FD4A7A22DE55E19743"/> <user name="wolfgang" password="85C69322756E01FD4A7A22DE55E19743"/> </credentials> </forms> </authentication> string encryptedPwd = ... FormsAuthentication.HashPasswordForStoringInConfigFile("myPwd", "MD5"); </system.web> ... </configuration>

The users "peter" and "wolfgang" as well as their passwords are stored on the server
83

Authentication (How it Works)


1. Anonymous user tries to access A.aspx 2. Because of <deny users="?"/> and <forms loginUrl="Login.aspx"> the user is redirected to Login.aspx directory requiring authentication A.aspx B.aspx C.aspx

web.config
<deny users="?" /> .. <forms loginUrl="Login.aspx" ...>

3. User enters her name and password and is authenticated

no

yes
4. Authentication successful?

5. User is redirected to A.aspx and may also access all other pages of this directory now (because she is authenticated)

84

Login.aspx
<%@ Page Language="C#" %> <%@ Import Namespace="System.Web.Security" %> <html> <head> <title>Login page</title> <script Language="C#" Runat="server"> void Authenticate (object sender, EventArgs e) { if (FormsAuthentication.Authenticate(user.Text, pwd.Text) || user.Text == "Karin") FormsAuthentication.RedirectFromLoginPage(user.Text, false); else msg.Text = "-- authentication failed"; } </script> </head> <body> <form Runat="server"> <asp:TextBox ID="user" Runat="server"/> Name<br> <asp:TextBox ID="pwd" TextMode="Password" Runat="server"/> Password<br><br> <asp:Button ID="button" Text="Login" OnClick="Authenticate" Runat="server" /> <br><br> <asp:Label ID="msg" Runat="server" /> </form> </body> </html>
85

User Identification With Cookies


How does ASP.NET remember if a user is already authenticated?
Client GET "A.aspx" HTML + cookie GET "B.aspx" + cookie HTML + cookie* This cookie tells the server that the user is already authenticated Server GET "Login.aspx" cookie identifies the user Login Server

Specifications about Cookies in the configuration file


<forms loginUrl="Login.aspx" name="mycookie" protection="All" timeout="20" >

name of the cookie to be generated

cookies should be encrypted

cookies should become invalid after 20 minutes

86

ASP.NET
Simple Dynamic Web Pages Web Forms Event Handling Web Controls Validators User Controls Custom Controls State Management Configuration of ASP.NET Working with Visual Studio .NET

Creating a Project
1

2 3

88

Composing a GUI With Drag & Drop


Solution Explorer the created GUI

Toolbox Property Window Used to switch between design view and HTML view

89

HTML View

90

Event Handling
Double click on a Button creates an event handler in the code behind

event handler for Click event

91

Executing the Page


Menu: Debug | Start

92

What are Web Services?


Middleware for distributed applications For remote procedure calls und data exchange Open standard based on XML For loosely coupled software services Independent of programming languages and operating systems Utilizing existing Internet protocols and server architectures

93

Definition Web Service (by W3C)


Software application identified by URI interface description in XML with interaction on the basis of XML encoded messages and message exchange on the basis of Internet protocols

94

Independence and Integration through ...

SOAP
XML standard for message encoding independent of transport protocol independent of client and server implementations: Java, .NET, Python,

Web Services Description Language - WSDL (1.1)


Interface description in XML

Communication on the basis of existing protocols and server architectures


HTTP and Web server SMTP and mail server FTP and FTP server

Standardisation (W3C)
SOAP 1.2, WSDL 1.1 (1.2 und 2.0) additional protocols based on SOAP and WSDL protocol bindings (HTTP)
95

Web Services Scenario


script client
SOAP HTTP

Web Service A

SOAP HTTP

Web Service B

Java client

SOAP HTTP

IIS (.NET web service container)


SOAP SMTP

.NET client

SOAP HTTP

WebService C
web server + Java web service container

SOAP SMTP

Web Service D e-mail server + SOAP processor

... client

SOAP protocol X

SOAP protocol

remote procedure call


96

Web Services in Comparison


Java RMI Programmi ng language Java .NET Remoting CORBA Web services independent .NET independent languages (C#, VB.NET, ..)

Interface definition
Data structures Transport protocol Packaging

Java Interfaces
Java objects RMI-IIOP

C# Interfaces
.NET objects binary or OAP .NET object serialisation

CORBA IDL

WSDL (XMLbased)

IDL-specified XML data objects GIOP/IIOP HTTP, HTTPS, SMTP, FTP SOAP
97

Java object serialisation

ORB/CDR

Pros and Cons

Pros
independent of programming language, run time environment and operating system Built on existing Internet infrastructure standardized promoted from important players (Microsoft, IBM, SAP, Sun)

Cons
performance (XML)
98

Web Service Infrastructure


Discover Services What services do exist? Where are they? (URL) E.g.: UDDI, DISCO client(s) Service Description (in WSDL) What message does the service know and how are those called? Service Calls Using services via SOAP, HTTP, XML-RPC, ...

Web Service + container


99

Web Service Architecture


Discovery service WSD1 WSD2 ... URL1 URL2 ...

pu

rc h

bli

se a

sh

Web service container Client inquiry call Web Service

100

Web Service Architecture (2)


Discovery service WSD1 WSD2 ... URI1 URI2 ...

pu

rc h

bli

se a

sh
service inquiry (URI) service description (WSD)

service inquiry service description (WSD)


service call result

Client

service call (SOAP) result: SOAP

Web service container

Web service

101

Web Services
Introduction Web Services in .NET SOAP SOAP and .NET Service Description with WSDL Discovery of Web Services: UDDI and DISCO Preview of Web Services .NET 2.0 Summary

Web Services in .NET


IIS and ASP.NET infrastructure support web services .NET Framework provides several base classes attributes protocols for the realization of web services Visual Studio.NET provides powerful tools for developing web services implementation testing administration of IIS generation of proxy code (wsdl.exe)

103

.NET Namespaces

System.Web.Services
for developing web services (e.g.: WebService, WebMethod)

System.Web.Services.Configuration
for extending SOAP

System.Web.Services.Description
for creating and manipulating WSDL descriptions

System.Web.Services.Discovery
for using DISCO

System.Web.Services.Protocols
for implementation of communication protocols (e.g. SOAP-HTTP)

System.Xml.Serialization
for XML serialization
104

Implementation of Web Services in asmx-file with @WebService directive


<%@ WebService Language="C#" Class="MyWebService" %>

deriving from base class System.Web.Services.WebService


public class MyWebService : WebService {

Identification and settings by .NET attributes


identification of web service methods definition of format and encoding XML namespaces and element names to use etc.
[WebMethod(Description= comment ")] [] public Returntype MyWebMethod( ) {

asmx-File in a virtual directory in the IIS


105

106

WebService Description in IE

107

Example: Simple .NET Client


wsdl.exe generated proxy for client (TimeClient.TimeService)
> wsdl.exe /namespace:TimeClient /out:TimeServiceProxy.cs http://localhost/netsem-ws/MyFirstService.asmx

Client program creates TimeService object and calls GetTime


using System; using TimeClient; //Namespace des erzeugten Proxies public class NetClient { public static void Main(string[] args) { TimeService service = new TimeService(); Console.WriteLine("Die Zeit am Server ist: "); string time = service.GetTime(true); Console.WriteLine(time); } }

108

Example: Simple Java Client

Using GLUE tool + Java libraries: wsdl2Java create Java interface (ITimeServiceSoap) and proxy (TimeServiceHelper)
import Kapitel7.GLUEProxy.*; // import generated GLUE proxy classes /** Simple XML web service client in Java using GLUE */ public class JavaClientGLUE { public static void main(String[] args) { try { // Calling service using class and interface generated by wsdl2java ITimeServiceSoap service = TimeServiceHelper.bind(); String time = service.GetTime(true); System.out.println(The time on the server is: \n" + time); } catch (Exception ex) { ex.printStackTrace(); } } }

109

Web Services
Introduction Web Services in .NET SOAP SOAP and .NET Service Description with WSDL Discovery of Web Services: UDDI and DISCO Preview of Web Services .NET 2.0 Summary

SOAP

Simple message protocol in XML


for packaging arbitrary application data single messages only (one-way) asynchronous

Independent of transport protocol SOAP does not define:


distributed object model communication protocol distributed garbage collection distributed events (distributed callbacks)
111

Application of SOAP
SOAP is extendable method call protocol (RPC) security authentication etc. Protocol realisation by combination of messages (message exchange patterns) one-way , request-response , multicast, e.g.: request-response for RPC by 2 messages

1: GetTime_Request 2: GetTime_Response

Client

Server
112

SOAP Messages
SOAP messages comparable to letters with
<Envelope> <Header> Message Header Message Header

envelope

<Body> Data

(<Envelope>) as container letter head (<Header>) with meta information (Message Headers)
letter

(<Body>)

<Fault> Fault Descriptions

with

arbitrary XML data


113

XML Structure (simplified SOAP 1.2)


<?xml version="1.0" ?> <soap:Envelope xmlns:soap="..."> <soap:Header> <!-- (optional and extendable) --> <m:my xmlns:m="anURI" soap:mustUnderstand=true" soap:role=uri2" /> ... </soap:Header> <soap:Body> data (depends on encoding and format) <soap:Fault> <soap:Code>...who is responsible?... </Code> <soap:Reason>...textual description...</soap:Reason> <soap:Detail>...more error details...</soap:Detail> </soap:Fault> </soap:Body> </soap:Envelope>
114

Data in <Body> Part

Message format:
document structure defined by XML schema rpc structure defined by SOAP for RPC

Data encoding:
literal encoding defined by XML schema encoded encoding defined by SOAP encoding rules

Usual combinations:
document/literal standard in .NET

rpc/encoded

often used by Java

115

HTTP Binding

HTTP-GET, HTTP-POST
call encoded in HTTP (URL encoded) response encoded in XML

Restricted to simple calls (no headers, no structured data)

SOAP over HTTP-POST


data part of POST request contains SOAP encoded call response SOAP encoded

No restrictions
116

Example: HTTP-POST
Call of GetTime(bool shortForm) of web service

http://localhost/time/TimeService.asmx
Call :
http://localhost/time/TimeService.asmx/GetTime?shortForm=true

HTTP response:
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <string xmlns="http://tempuri.org/">string</string>

117

Example: SOAP over HTTP (1)


SOAP over HTTP-POST:
POST /time/TimeService.asmx HTTP/1.1 Content-type: text/xml; charset=utf-8 SOAPAction: http://dotnet.jku.at/GetTime Content-length: 198 User-Agent: Java1.4.0 Host: localhost Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive

HTTP header SOAPAction identifies SOAP request

<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetTime xmlns="http://tempuri.org/" <shortForm> true </shortForm> < /GetTime> </soap:Body> </soap:Envelope>

Web method Parameter

118

Example: SOAP over HTTP (2)

SOAP encoded response:

HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/ xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd="http://www.w3.org/2001/XMLSchema"> Return <soap:Body> <GetTimeResponse xmlns="http://tempuri.org/"> value <GetTimeResult>string</GetTimeResult> </GetTimeResponse> </soap:Body> </soap:Envelope>

119

Web Services
Introduction Web Services in .NET SOAP SOAP and .NET Service Description with WSDL Discovery of Web Services: UDDI and DISCO Preview of Web Services .NET 2.0 Summary

121

Message Format and Encoding (1)


[SoapRpcMethod( Use=SoapBindingUse.Encoded Action="http://dotnet.jku.at/Sample/AddAddressRpc, // SOAP action RequestNamespace="http://dotnet.jku.at/Sample/Request", RequestElementName="AddAddressRpcRequest", // SOAP element name ResponseNamespace="http://dotnet.jku.at/Sample/Response", ResponseElementName="AddAddressRpcResponse")] // SOAP element name [WebMethod(Description="Adds an address DataSet for the specified user")] public void AddAddressRpc(long userID, Address address) { ... }

Attributes SoapRpcService and SoapRpcMethod for rpc format with parameters


Use: encoding (SoapBindingUse.Literal or SoapBindingUse.Encoded) Action: URI for SOAPAction-HTTP header RequestNamespace and RequestElementName: namespace and name of SOAP element for request ResponseNamespace and ResponseElementName: namespace and name of SOAP element for response
122

123

SOAP Encoding of Data Types

Serializing of .NET data types

on the basis of SOAP encoding rules


adjusted bySerializing attributes SoapAttributeAttri field(namespace as XML attribute
buteSystem.Web.Serialization)
SoapElementAttri Serializing field as XML element bute

SoapIgnoreAttrib ute

No serialization of field
124

SoapIncludeAttrib Including a type

Example: Encoding of a Type (1)


Web method GetTimeDesc uses type TimeDesc for return value
[WebMethod(Description="Returns the time description of the server")] public TimeDesc GetTimeDesc() { TimeDesc td = new TimeDesc(); // ... return td; }

Encoding of TimeDesc adjusted by attribute [SoapAttribute] fields encoded as XML attributes


public struct TimeDesc { [SoapAttribute] public string TimeLong; [SoapAttribute] public string TimeShort; [SoapAttribute (AttributeName = "ZoneID")] public int TimeZone; }

125

Example: Encoding of a Type (2)


SOAP encoded response
... <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" ... <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <types:GetTimeDescResponse> <GetTimeDescResult href="#id1" /> </types:GetTimeDescResponse> <types:TimeDesc id="id1" xsi:type="types:TimeDesc" types:TimeLong="10:00:25" types:TimeShort="10:00" types:ZoneID="1" /> </soap:Body> </soap:Envelope>

126

Including Types

SoapIncludeAttribute allows inclusion of types


Example: PersonService

important for specializations


Person has 2 specializations Customer and Employee
Person
[WebMethod] public Person[ ] GetAll() {}

Web method with return value of type Person[]


public class PersonService : WebService {

Customer

Employee

Customer and Employee have to be included explicitly into web service description!
127

Example: PersonService (1)

public abstract class Person { } public class Customer : Person { } public class Employee : Person {}

Classes Person, Customer and Employee

PersonService defines web method GetAll with return type Person[] SoapInclude attribute includes Customer and Employee types
<%@ WebService Language="C#" Class="PersonService" %> using System; using System.Xml.Serialization; public class PersonService : WebService { [WebMethod] [SoapRpcMethod] [SoapInclude(typeof(Customer)), SoapInclude(typeof(Employee))] public Person[] GetAll() { Person[] data = new Person[2]; data[0] = new Customer("1, "Max Customer", "EMP-33"); data[1] = new Employee("EMP-33", "Tom Employee"); return data; } }
128

Example: PersonService (2)

SOAP encoded response

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" ... > <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <tns:GetAllResponse> <GetAllResult href="#id1" /> </tns:GetAllResponse> <soapenc:Array id="id1" soapenc:arrayType="types:Person[2]"> <Item href="#id2" /> <Item href="#id3" /> </soapenc:Array> <types:Customer id="id2" xsi:type="types:Customer"> <SSN xsi:type="xsd:string">1</SSN> <Name xsi:type="xsd:string">Max Customer</Name> <EmpSSN xsi:type="xsd:string">EMP-33</EmpSSN> </types:Customer> <types:Employee id="id3" xsi:type="types:Employee"> <SSN xsi:type="xsd:string">EMP-33</SSN> <Name xsi:type="xsd:string">Tom Employee</Name> </types:Employee> </soap:Body> 129 </soap:Envelope>

SOAP Header Entries


SOAP header entries are used for metainfos in messages Arbitrary header entries are possible All header entries have attributes
recipient of entry (Actor) if it must be handled by recipient (mustUnderstand)

.NET supports header entries by:


Class SoapHeader: development of header entry classes
Attribute SoapHeaderAttribute: Defining header entries for web methods
130

SoapHeader and SoapHeaderAttribute


SoapHeader
//----- properties public string Actor { get; set; } public bool MustUnderstand { get; set; } public bool DidUnderstand { get; set; } ...

SoapHeaderAttribute
//----- properties public SoapHeaderDirection Direction {get; set;} public string MemberName {get; set;} ...

Recipient
public string Actor {get; set;}

In-, Out-, InOut direction of headers


public SoapHeaderDirection Direction {get; set;}

Header must be handled


public bool MustUnderstand {get; set;}

Name of field of web service class for header entry


public string MemberName {get; set;}

Header handled successfully


public bool DidUnderstand {get; set;}

131

Example: AuthHeader (1)


User indentification in TimeService
Login returns identification code (cookie) GetTime sends back identification code in header entry

Header class AuthHeader defines public field cookie

public class AuthHeader : SoapHeader { public string cookie; }

Web service class defines field curUser to store AuthHeader object


[WebService(Namespace="http://dotnet.jku.at/time/")] public class HeaderTimeService : WebService { public AuthHeader curUser;

Login with user and password returns identification string


[WebMethod (Description="Authenticates the user")] public string Login(string user, string pwd) { ... create cookie ... } bool ValidateCookie(string cookie) { ... validate cookie ... }
132

Example: AuthHeader (2)


GetTime requires header entry of type AuthHeader which will be stored in field curUser Validates user based on login data
[WebMethod(Description="Returns the current time")] [SoapHeader("curUser")] public string GetTime() { if (curUser != null && ValidateCookie(curUser.cookie)) return System.DateTime.Now.ToLongTimeString(); else throw new SoapHeaderException("Access denied!", SoapException.ClientFaultCode); }

133

Example: AuthHeader (3)


Client

creates service proxy and AutHeader object


HeaderTimeService proxy = new HeaderTimeService(); AuthHeader entry = new AuthHeader();

receives cookie from call to Login


entry.cookie = proxy.Login(user, pwd);

sets the AuthorHeader in proxy calls GetTime with AuthHeader header entry
entry.cookie = proxy.Login(user, pwd); proxy.AuthHeaderValue = entry; Console.WriteLine(proxy.GetTime());
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://..." ... > <soap:Header> <AuthHeader xmlns="http://dotnet.jku.at/time/"> <cookie>aewt12348cvNNgrt55</cookie> </AuthHeader> </soap:Header> <soap:Body> <GetTime xmlns="http://dotnet.jku.at/time/" /> </soap:Body> </soap:Envelope> 134

Life Cycle
Web service objects are stateless Are created for each call public HttpApplicationState {get;} Data can be storedApplication in properties of Application state object or

public HttpApplicationState Session {get;}

public sealed class HttpSessionState : ICollection, IEnumerable { Sesssion state object public object this[ string name ] {get; set;} public object this[ int index ] {get; set;} }
135

Example: StateDemo (1)


Web service StateDemo demonstrates storage of data
<%@ WebService Language="C#" Class="StateDemo" %> using System.Web.Services; [WebService(Namespace="http://dotnet.jku.at/StateDemo/")] public class StateDemo : WebService {

IncApplication increases property "Hit" of Application state object


[WebMethod()] public int IncApplication() { int hit = (Application["Hit"] == null) ? 0 : (int) Application["Hit"]; hit++; Application["Hit"] = hit; return hit; }

136

Example: StateDemo (2)


Parameter EnableSession enables usage of Session object IncSeesion increases property "Hit" of Session state object
[WebMethod(EnableSession=true)] public int IncSession() { int hit = (Session["Hit"] == null) ? 0 : (int) Session["Hit"]; hit++; Session["Hit"] = hit; return hit; } }

137

Web Services
Introduction Web Services in .NET SOAP SOAP and .NET Service Description with WSDL Discovery of Web Services: UDDI and DISCO Preview of Web Services .NET 2.0 Summary

Web Service Description Language (WSDL)


WSDL is an XML based IDL for web services a WSD describes: used data types structure of messages operations (methods) protocols to call operations addresses of web service

current version in .NET: WSDL 1.1 (http://schemas.xmlsoap.org/wsdl/) Working Draft: WSDL 2.0 (10/4/2004)

139

Structure of WSDL 1.1


<definitions> <types> </types> <message> <part> </part> </message> <portType> <operation> <input> <output> </operation> </portType> <binding> <operation> </binding> <service> <port> </service> </definitions> WSDL description of a web services types defined in <xsd:schema> simple messages parts of messages

interface specification operations of an interface input message output message

abstract part

binding of interface to protocols and encoding description of the binding for each operation service description URI and binding to port

concrete part

140

WSDL for TimeService (1)

WSDL description created by web container (IIS) http://localhost/WebProject1/TimeService.asmx?WSDL

<?xml version="1.0" encoding="utf-8"?> <definitions xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/ xmlns:tns="http://dotnet.jku.at/time/" xmlns:s="http://www.w3.org/2001/XMLSchema xmlns:http="http://schemas.xmlsoap.org/wsdl/http/ xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/ xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/ targetNamespace="http://dotnet.jku.at/time/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types /> <message name="GetTimeSoapIn" /> <message name="GetTimeSoapOut"> <part name="GetTimeResult" type="s:string" /> </message> <portType name="TimeServiceSoap"> <operation name="GetTime"> <input message="tns:GetTimeSoapIn" /> <output message="tns:GetTimeSoapOut" /> </operation> </portType>

abstract part

141

WSDL for TimeService (2)


<binding name="TimeServiceSoap" type="tns:TimeServiceSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" /> <operation name="GetTime"> <soap:operation soapAction="http://dotnet.jku.at/time/GetTime" style="rpc" /> <input> <soap:body use="encoded" namespace="http://dotnet.jku.at/time/ encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </input> <output> <soap:body use="encoded" namespace="http://dotnet.jku.at/time/ concrete encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> part </output> </operation> </binding> <service name="TimeService"> <documentation>Simple web service for querying the time</documentation> <port name="TimeServiceSoap" binding="tns:TimeServiceSoap"> <soap:address location="http://localhost/time/TimeService.asmx" /> </port> </service> </definitions>
142

Web Services
Introduction Web Services in .NET SOAP SOAP and .NET Service Description with WSDL Discovery of Web Services: UDDI and DISCO Preview of Web Services .NET 2.0 Summary

Universal, Description, Discovery and Integration (UDDI)

Standardized http://www.uddi.org protocol for searching for and using web services Provides web services interface
2.) search 1.) register Directory
(UDDI)

Client

3.) connect 4.) call

Web Service A Web Service B


144

DISCO

Microsofts technique for dynamic usage of web services DISCO file contains XML document with URIs pointing to web services can be the result to a UDDI inquiry

.NET support in namespace System.Web.Services.Discovery


145

DISCO Descriptions

Creation of DISCO descriptions:


by command tool disco.exe
> disco.exe /out:WebProject1 WebProject1/TimeService.asmx

by IIS

http://localhost/WebProject1/TimeService.asmx?DISCO

<?xml version="1.0" encoding="utf-8" ?> Access <discovery xmlns:xsd="http://www.w3.org/2001/XMLSchema WSDL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xmlns="http://schemas.xmlsoap.org/disco/"> <contractRef ref="http://localhost/WebProject1/TimeService.asmx?wsdl docRef="http://localhost/WebProject1/TimeService.asmx" Call xmlns="http://schemas.xmlsoap.org/disco/scl/" /> <soap address="http://localhost/WebProject1/TimeService.asmx" xmlns:q1="http://dotnet.jku.at/time/" binding="q1:TimeServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> 146 </discovery>

TimeService Discovery (1)


2 variants of TimeService

TimeService1
<%@ WebService Language="C#" Class="TimeService1" %> using System.Web.Services; [WebService(Namespace="http://dotnet.jku.at/time/", Name="TimeService")] public class TimeService1 : WebService { [WebMethod(Description="Returns the current server time")] public string GetTime() { return System.DateTime.Now.ToLongTimeString(); } }

<%@ WebService Language="C#" Class="TimeService2" %> using System.Web.Services; [WebService(Namespace="http://dotnet.jku.at/time/", Name="TimeService")] public class TimeService2 : WebService { [WebMethod] public string GetTime() { return "I dont know the time!"; } }
147

TimeService2

TimeService Discovery (2)


Disco client with discovery of DISCO file
using System; using System.Web.Services.Discovery; using System.Collections; public class DiscoSample { public static void Main(string[] args) {

loading the DISCO files


DiscoveryClientProtocol discoClient = new DiscoveryClientProtocol(); foreach (string uri in args) { discoClient.Discover(uri); }

iterating over all DISCO descriptions


discoClient.ResolveAll(); TimeService proxy = new TimeService(); foreach (object obj in discoClient.Documents.Values) { DiscoveryDocument dDoc = obj as DiscoveryDocument;
148

TimeService Discovery (3)


iterating over all <contactRef>-elements and retrieve URLs
ContractReference contr = null; IEnumerator it = dDoc.References.GetEnumerator(); while (contr == null && it.MoveNext()) contr = it.Current as ContractReference;

given URL connect to web service and call web method


if (contr != null) { proxy.Url = contr.DocRef; Print("Connecting proxy to " + proxy.Url); proxy.Discover(); Print("Result of GetTime: " + proxy.GetTime()); } }

}
} static void Print(string msg) { System.Console.WriteLine(msg); } }
149

Web Services
Introduction Web Services in .NET SOAP SOAP and .NET Service Description with WSDL Discovery of Web Services: UDDI and DISCO Preview of Web Services .NET 2.0 Summary

Indigo

Web services in .NET 2.0 are integrated in

Indigo

Indigo unites .NET remoting Web services .NET Enterprise Services in one uniform programming model Indigo provides transactions reliable communication secure communication and authentication independence of transport protocols

151

Indigo Architecture
service message flow typed channel untyped channel port

formatter

transport to destination
152

Indigo Web Service Example (1)


Implementation of web service TimeService
using System; using System.MessageBus.Services; [DatagramPortType(Name="TimeService", Namespace="http://dotnet.jku.at/WS")] public class TimeService { [ServiceMethod] public DateTime GetTime() { DateTime now = DateTime.Now; Console.WriteLine ("Time request at {0}", now); // output to monitor server return now; } }

Compiling and creation of assembly


csc /target:library /reference:System.MessageBus.dll TimeService.cs

Creating the WSDL description


wsdlgen TimeService.dll

153

Indigo Web Service Example (2)


Implementation of the server application
using System; using System.MessageBus.Services; using System; using System.MessageBus; class Server { static void Main () { ServiceEnvironment se = null; try { se = ServiceEnvironment.Load(); se.Open(); Console.WriteLine("Press enter to stop the service ..."); Console.ReadLine(); } finally { if (se != null) se.Close(); } } }

154

Indigo Web Service Example (3)


Configuration of the server in file Server.exe.config
<configuration> <system.messagebus> <serviceEnvironments> <serviceEnvironment name="main"> <port> <identityRole> soap.tcp://localhost:12345/TimeService/ </identityRole> </port> <remove name="securityManager"/> <!-- Security disabled!!! --> <policyManager> <areUntrustedPolicyAttachmentsAccepted> true </areUntrustedPolicyAttachmentsAccepted> <isPolicyReturned> true </isPolicyReturned> </policyManager> <serviceManager> <activatableServices> <add type="TimeService, TimeService" /> </activatableServices> </serviceManager> </serviceEnvironment> </serviceEnvironments> </system.messagebus> </configuration>

155

Indigo Web Service Example (4)


Compilation of the server application
csc /reference:System.MessageBus.dll Server.cs

Creation of the proxy for the client


wsdlgen dotnet_jku_at.WS.wsdl dotnet_jku_at.WS.xsd

Compilation of the proxy code


csc /target:library /reference:System.MessageBus.dll dotnet_jku_at.WS.cs

156

Indigo Web Service Example (5)


Implementation of the client application
using System; using System.MessageBus.Services; public class Client { public static void Main () { ServiceEnvironment se = null; try { se = ServiceEnvironment.Load(); ServiceManager sm = se[typeof(ServiceManager)] as ServiceManager; if (sm == null) throw new Exception("ServiceManager is not available."); se.Open(); Uri uri = new Uri("soap.tcp://localhost:12345/TimeService/"); // get a channel to the web service from the default service manager ITimeServiceChannel channel = (ITimeServiceChannel) sm.CreateChannel(typeof(ITimeServiceChannel), uri); Console.WriteLine(channel.GetTime());// invoke web service method } catch (Exception e) { Console.WriteLine(e); } finally { if (se != null) se.Close(); } } }

Configuration of the client (analogous to the server) and compilation


csc /reference:System.MessageBus.dll,dotnet_jku_at.WS.dll Client.cs
157

Indigo Web Service Example (6)


Starting the server and the client
//----- Server > Host.exe Press enter to stop the service ... Time request at 1/29/2004 3:35:51 PM > //----- Client

> Client.exe Time request at 1/29/2004 3:35:51 PM >

158

Web Services
Introduction Web Services in .NET SOAP SOAP and .NET Service Description with WSDL Discovery of Web Services: UDDI and DISCO Preview of Web Services .NET 2.0 Summary

Summary

Web services are a middleware technology on the basis of XM and Internet protocols independent of programming language and run time system for the integration of heterogeneous, distributed systems .NET supports web services development of web services development of web service clients discovery and dynamic connection to web services In .NET 2.0 Indigo unites the different remoting 160 technologies