Aspnet
Aspnet
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
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
Working of ASPX
client (browser)
request ("Counter.aspx")
ASP.NET
Counter.aspx
preprocessor, compiler
page class Lader
server (IIS)
*.html
page object
.NET framework
7
does not contain any script code any browser can display this HTML
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
aspx page
<%@ Page Language="C#"%> <html> <body> ... <%= ... %>... </body> </html>
Counter.aspx
Counter_aspx ...
11
CounterPage CounterValue()
aspx page
Counter.aspx
<%@ Page ... Inherits="CounterPage"%> <html> <body> ... <%=CounterValue()%>... </body> </html>
Counter_aspx ...
12
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>
Problems
- CGI programming is tedious - restricted to HTML elements - must manage the state of text fields manually when the page is sent back
15
16
17
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
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
one can access all its properties and methods: page.IsPostBack, page.User, page.FindControl(), ...
one can access all their properties and methods: amount.Text, amount.Font, amount.Width, ...
amount.Text does not need to be set before the page is sent back
20
Calendar
Label TextBox
DataGrid ...
Button
RadioButton CheckBox DropDownLis
21
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) { ... }
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
+ page state
Label
TextBox Button
Click
Client
Server
26
+ page state
Label
TextBox Button
Click
Client
Server
27
+ page state
Label
TextBox Button
Click
3. Loading - load controls with the values that the user has entered (page state) - raise Load events
Client
Server
28
Label
TextBox Button 4. Action handle event(s) (Click, TextChanged, ...)
Client
Server
29
Label
HTML
<html> ... <input type="text" ...> <input type="button" ...> ... </html>
TextBox Button
+ page state 5. Rendering - raise PreRender events - call Render methods of all controls, which render the controls to HTML
Client
Server
30
Label
TextBox
<html> ... <input type="text" ...> <input type="button" ...> ... </html>
Button
Client
Server
31
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
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
ListBox
TextBox
Page
Controls
Parent
Page
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 }
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); }
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, ... }
38
Enabled
<asp:Button Enabled="false" ... />
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
delegate EventHandler either in the code behind or in <script> tags of the page
40
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 }
<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; } }
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 }
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
48
Database)
Class DropDownList
public class DropDownList: ListControl { // same interface as ListControl }
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
Events are raised depending on the column kind BoundColumn ButtonColumn EditCommandColumn
53
ButtonColumn
54
raised events
ItemCommand + SelectedIndexChanged ItemCommand + DeleteCommand ItemCommand ItemCommand + EditCommand ItemCommand + UpdateCommand ItemCommand + CancelCommand
e.CommandName
CommandName Edit-Button UpdateButton CancelButton "Edit" "Update" "Cancel"
55
EditCommandColumn
56
57
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
BaseCompareValidator
RangeValidator
CompareValidator
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
63
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
WebControl
ImageButton Fold
must override the Render method, which translates this control to HTML
67
Fold)
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
Session state
writing: reading: Session["cart"] = shoppingCart; DataTable shoppingCart = (DataTable) Session["cart"];
Application state
writing: reading: Application["database"] = databaseName; string databaseName = (string) Application["databaseName"];
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; } ... }
<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
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
virtual directories
machine.config
web.config
web.config
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appSettings> <add key="author" value="hm" /> <add key="organisation" value="JKU" /> </appSettings> ... </configuration>
79
Example: Tracing
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.web> <trace enabled="true" pageOutput="true" /> ... </system.web> ... </configuration>
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>
machine.config contains
<allow users="*" />
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
web.config
<deny users="?" /> .. <forms loginUrl="Login.aspx" ...>
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
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
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
91
92
93
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
SOAP
XML standard for message encoding independent of transport protocol independent of client and server implementations: Java, .NET, Python,
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 Service A
SOAP HTTP
Web Service B
Java client
SOAP HTTP
.NET client
SOAP HTTP
WebService C
web server + Java web service container
SOAP SMTP
... client
SOAP protocol X
SOAP protocol
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
ORB/CDR
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
pu
rc h
bli
se a
sh
100
pu
rc h
bli
se a
sh
service inquiry (URI) service description (WSD)
Client
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
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
106
WebService Description in IE
107
108
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
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>)
with
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
115
HTTP Binding
HTTP-GET, HTTP-POST
call encoded in HTTP (URL encoded) response encoded in XML
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
<?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>
118
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
123
SoapIgnoreAttrib ute
No serialization of field
124
125
126
Including Types
Customer
Employee
Customer and Employee have to be included explicitly into web service description!
127
public abstract class Person { } public class Customer : Person { } public class Employee : Person {}
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
<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 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)
SoapHeaderAttribute
//----- properties public SoapHeaderDirection Direction {get; set;} public string MemberName {get; set;} ...
Recipient
public string Actor {get; set;}
131
133
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 sealed class HttpSessionState : ICollection, IEnumerable { Sesssion state object public object this[ string name ] {get; set;} public object this[ int index ] {get; set;} }
135
136
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
current version in .NET: WSDL 1.1 (http://schemas.xmlsoap.org/wsdl/) Working Draft: WSDL 2.0 (10/4/2004)
139
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
<?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
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
Standardized http://www.uddi.org protocol for searching for and using web services Provides web services interface
2.) search 1.) register Directory
(UDDI)
Client
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
DISCO Descriptions
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>
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
}
} 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
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
153
154
155
156
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