Introduction
Web Service ?? Shouldn't that be Windows Service (Win Services) ?
Hmmm... Nopes its Web Services !! With the introduction of the new
.NET platform there has been a creation of "Web Services".
So one more type of service to learn, understand --- yep but one
thing is that its pretty easy to learn and master. Note this example is
specific to .NET SDK beta1 and won't work on any other version of
the SDK.
So what is a Web Service
?
The simple answer to that would be a, "Application
running as a service delivered over the Web". If I was to break
up this statement there are few points which get highlighted.
1) A Web Service is a Application.
2) To be more precise its a Application running as a Service (like
Windows Services in Windows 2000) . So one thing is cleared that
once deployed a Web Service will run in the Background for 24x7 (24
hours a day, 7 days a week).
3) "Delivered over the Web" - This statement says a lot
of things about Web Services. Firstly Web Services are URL
addressable i.e. You can call (invoke) it from your browser by
typing the path to the Service e.g. "http://localhost/myservice.asmx"
.
If you think a bit more deeper over the point "Delivered over
the Web" and if you know a bit about the Protocols used over
the Web you can easily make out that Web Services have to use either
of the 2 protocols widely used on the Internet "HTTP or
FTP". Since FTP is to transfer files to using it is out of
question , hence no prizes for guessing that Web Services use HTTP
protocol for communication with its clients. That means
that you do not
need any special software to host and run your Web Services, your
normal Web Server will be able to serve your Web Services...(there
you save your precious time and Brain in learning that a new Server
first that runs your application !!). As stated above Web Services
uses HTTP for communication with its clients, this is a very big
advantage over other remote services like DCOM , RMI etc which have
their own Object -Specific Protocols.
The Web Service interface
can be defined strictly in terms of Messages
a
Web Service Accepts and
Generates. This lead to a conclusion that Web Services talk with its
clients with Messages. Due to XML being the Internets Favorite of
describing Data, Microsoft has used XML extensively in Web Services.
The Messages transferred to/fro from the Web Service are in XML
format. Another standard used to access a Object remotely is SOAP
(Simple Object Access Protocol). Web Services use SOAP encoded XML
messages to communicate. Does that mean you have to learn XML and
SOAP ?? Not exactly, that's the beauty of Web Services which leads
to some people calling it as having "Black - Box"
functionality. What they mean is that you can code and use Web
Service with out knowing exactly how the Web Service is implemented
i.e. You will never need to worry about how the messages get coded
into SOAP and XML and how they are transferred to it clients.
A very important point that many of you might have already
understood would be that the Clients (consumers) of the Web Service
could be from any platform, Object model and Programming Language.
As long as they can understand and generate SOAP encoded XML
messages , You guessed that, didn't you? This solves a big problem
of application interoperability being experienced by today's
programmers.
Future of Web Service?, will all my applications get
converted to Web Services? Impact of Web Services?
Hey, hey hold
on a second... I am just 21 and still getting a gist of how the
Programming World Functions!! It would be better if you ask those
questions to seasoned developers, having a experience of 10-20 years
out there who would let you and Me know, of this technology's
future? As for me, I am all excited and can find many applications
for it in the present Web scenario. One such field I think where Web
Services could be a major boon would be in the field of
"Content Providers" , as I call them. If you are a regular
browser of many "Consumer Oriented Portals" which provide
daily updates of News, Sports, Stocks, Games, Weather, E-mail, ....
and not to forget Horoscopes (That's what I look up every day to
count my chances of emerging as a good programmer :) )!!! The
point I want to make here is that you will find that many of these
"Consumer Oriented Portals" actually do not create
original content in all the sections. They subscribe to some other
Portals which provide specialized information on that section,
that's the reason why if you surf many such portals you will find
that the content of some of their columns like Sports, Weather etc
are the same. Such portals which offer specialized information
are called as "Content Providers", since they provide
specialized content to other Portals as well as to general surfers
directly.
I have tried here to outline a hypothetical Web Service which such
Content Providers could use. Guess what I will be delivering as
Content through my Web Service? ........ Ahmmm Horoscopes
........ .
Yep this is what my sample service would deliver, Daily Horoscopes.
Since I am not a astrologer I will not provide accurate readings nor
will I be updating it daily.... :) but still I will try to give it my best shot !
Design Considerations
A) Server Side ("Content Provider Side")
The horoscopes will be updated Daily by the staff. The
daily horoscopes will be stored in a XML file called dailyhoro.xml.
B) Clients ("Content Consumers")
The clients can view their Horoscopes through Web Pages
or through Applications. They will provide the Zodiac sign and the
Web Service will process their request and send them their daily
readings.
Xml Database File Format
<?xml version="1.0" ?>
<sign>
<zodiac>
<name></name>
<pred></pred>
<today></today>
</zodiac>
</sign>
|
Code
Time to kick up some real code. First we will see
the code for the Web Service. This Service is pretty simple, it
takes a string containing the "Zodiac Sign" as a input
parameter. Then it looks up its database for the prediction for the
"Zodiac Sign" the client entered. If a match if found then
it returns the user a string containing the Date for which the
horoscope is along with the prediction for the supplied sign. Just
incase you did not know there 12 zodiac signs namely -
"Aquarius, Pisces, Aries, Taurus, Gemini, Cancer, Leo, Virgo,
Libra, Scorpio, Capricorn, Sagittarius". What is your Zodiac
Sign ??? Mine is encoded in this example if you look carefully !
1) wshoro.asmx :- The Horoscope Web Service
<%@ Webservice Language="C#" class="DailyHoro" %>
using System ;
using System.Web.Services ;
using System.Xml ;
using System.Data;
using System.IO ;
//Define a Namespace for our Web Service
//Define a Description for our Web Service
[WebService(Namespace="http://www.mastercsharp.com/WebService"
Description="Web Service to deliver daily horoscopes")]
public class DailyHoro: WebService
{
//All the methods you want to expose to the Web Service should
//also be public methods.
//To make the method available to the Clients you have to mark the
//method with the attribute "[WebMethod]"
//only the marked methods will be available to the clients
//This method has one Input parameter as a String containing the Zodiac
//sign name of the Sign for which the client wants the Horoscope.
//In return we send the client the current date and the prediction.
[WebMethod(Description="Returns the prediction for the given Zodiac sign")]
public string GetHoro(string zodiac)
{
//We give a call to our private method which does all the data collection
//and sends the Current Date and prediction of the sign requested
//We return the data to the client
return getData( zodiac.ToLower() ) ;
}
//A Private method which takes the "Zodiac" sign as input and returns
//a string containing the current date and the Prediction for that sign.
//Since I am using XML as the Database, this method first reads the Data
//Then it searches for the specified sign in the database
private string getData(string zodiac)
{
try{
//Declare a FileStream
FileStream fin ;
//Set the Various parameters on the File stream.
//It is also to declaring "FileShare.ReadWrite"
//which will allow other users too to read this file
//Also the System Admins will have access to update the File.
fin= new FileStream(Server.MapPath("db/dailyhoro.xml"), FileMode.Open,
FileAccess.Read,FileShare.ReadWrite ) ;
//Create a DataSet object to contain our Database
DataSet ds = new DataSet() ;
//Read the Xml Schema and Data from the stream
ds.ReadXml(new StreamReader(fin)) ;
//close the stream
fin.Close() ;
//loop to check for the Zodiac sign provided
//We check up to 12, ??? any answers why ??
//Didn't get it may be it too much coffee ..
//There are only 12 Zodiac signs -Remember!!!
for(int i=0;i<12 ; i++)
{
//Check if the Zodiac sign provided by the user Equals
//the "name" field in our Table "zodiac"
if(zodiac.Equals( ds.Tables[0].Rows[i]["name"]) )
{
//If a match if found then return the Date and
//Prediction
string pred =ds.Tables[0].Rows[i]["pred"].ToString() ;
string date = ds.Tables[0].Rows[i]["today"].ToString() ;
return date+"@"+pred ;
}
}
//If no match found then return a error statement
return "Wrong Parameter" ;
}
catch(Exception ed)
{
//catch any error and inform the user a error has occurred
//in the Web Service
//You will not do this in real implementation
//Keep the user guessing or send him some understandable message
//like service down etc..
return "Read Error!! :"+ed.ToString() ;
}
}
}
|
That's It !!! Saw how easy it is to write a Web Service. You
don't even have to think how the Service will listen for incoming clients or the
communication will take place between the Service and its Clients. Save the file
as "wshoro.asmx". Web Services are stored with the extension ".asmx"
.
Web Service Deployment
To deploy a Web Service is as simple as deploying any other
ASP.NET Web Application. In our example create a Virtual Directory on your
computer if you are using a "localhost" Server, or simply upload your files to
any server supporting ASP.NET. Remember to place the "dailyhoro.xml" file in a
directory called "db" in the virtual directory. Now your web Service is deployed,
to call it just type the URL of the Web Service in to your browser. The page
that you see is auto generated by the .NET runtime. It gives some information
about the Web Service.
Consumers
Since your web service is ready you can now proceed with
writing clients to consume your service.
1) Proxy Class
In order for the client to use the Web Service they should have
knowledge of how the Web Service is implemented and how to call it etc. But as I
said before that you can talk to Web Services with out knowing how they are
implemented? You are right but theoretically the client cannot know
automatically about the Web Service. Hence all Web Services automatically
generate a XML document with WSDL(Web Service Description Language) grammar to
describe itself.
In our example say if you have installed the Web Service in a
Virtual Directory called "horoservice" then you can get the WSDL of the service by
calling the following URL in your browser "http://localhost/horoservice/wshoro.asmx?WSDL". This will generate a XML
file and display it in your browser.
The .NET SDK has a tool called "WSDL". This tool takes the
WSDL of a Web Service as a input and uses
Reflection to generate a Proxy Class that is similar to the Web Service. To
create a proxy class for our Horoscope Example use WSDL http://localhost/horoservice/wshoro.asmx?WSDL
/n:horo_service
Where "http://localhost/horoservice/wshoro.asmx?WSDL" -- is the full
URL to the WSDL.
Remember the WSDL of the Web Service and not the Web Service.
So
you can also save the WSDL of the Web Service to your Computer and use it for
creating a Proxy. "/n:horo_service" -- is to specify the Namespace to
create for the Proxy Class.
This will generate a file "DailyHoro.cs" in the
directory you called WSDL. This file contains the source code which
defines the Web Service in C#. Now compile this Source code to generate a
Library that we can use in our clients. The library generation command will
be. csc /target:library
DailyHoro.cs The above code will generate a Dll "DailyHoro.dll"
. With this you have successfully created your Proxy Library and now you can
easily write up clients to use your Web Service.
2) ClientHoro.aspx:- The Web Page Client Are you
awake ??? Grab a cup of coffee since we are on a part which many of you might be
knowing well by now. We are going to write a ASP.NET Web page which will consume
the Web Service we have just written.
|
<%@ Import namespace="System" %>
<%@ Import namespace="horo_service" %>
<%@ Page Language="C#" %>
<html>
<head>
<script language="C#" runat="server">
private void gethoro_Click(object sender,
EventArgs e)
{
//Get the Selected Item from the DropDownList
string sign = zodiac.SelectedItem.Text ;
//Create a Instance of the Proxy Class
DailyHoro dh = new DailyHoro() ;
//Call the "GetHoro" method of the Web
Service on the Proxy Object
//The Proxy object in turn communicates to the Web Service
//Remember the Proxy cannot do anything except act as a bridge between
//your Web Service and the client. It cannot replace the Web Service.
string result =dh.GetHoro(sign) ;
//Extract the Date from the Result
preddate.InnerHtml="<b> Horoscope for
"+sign+" as on
"+result.Substring(0,10)
+"</b>" ;
//Display the Prediction
predspace.InnerHtml=result.Substring(11) ;
}
</script>
<title>Horoscope Service Client</title>
</head>
<body>
<center>
<form runat="server" >
<table border="1" width="60%"
cellpadding="1" cellspacing="2">
<tr>
<td colspan=2> <b> Select your Zodiac
Sign</b></th>
</tr>
<tr>
<td>
<asp:DropDownList
id="zodiac" runat="server">
<asp:ListItem>aquarius</asp:ListItem>
<asp:ListItem>pisces</asp:ListItem>
<asp:ListItem>aries</asp:ListItem>
<asp:ListItem>taurus</asp:ListItem>
<asp:ListItem>gemini</asp:ListItem>
<asp:ListItem>cancer</asp:ListItem>
<asp:ListItem>leo</asp:ListItem>
<asp:ListItem>virgo</asp:ListItem>
<asp:ListItem>libra</asp:ListItem>
<asp:ListItem>scorpio</asp:ListItem>
<asp:ListItem>capricorn</asp:ListItem>
<asp:ListItem>sagittarius</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr>
<td colspan="2" >
<asp:Button onClick="gethoro_Click"
Text="Fetch !" runat="server"
/></td>
</tr>
<tr>
<td colspan="2"><div id="preddate"
runat="server" /></td>
</tr>
<tr>
<td colspan="2"><div id="predspace"
runat="server" /></td>
</tr>
</table>
</form>
</center>
</body>
</html>
|
Deploy the Web Application
To deploy the above Web Page is similar to deploying any
ASP.NET Page. Copy the File ClientHoro.aspx to your Virtual Directory. Also
remember to copy the Proxy Dll to your "Bin" directory located in the Virtual
Directory. If a "bin" directory does not exist then create it in your Virtual
Directory.
Wasn't that easy to consume the Web Service. Also since the input is
returned in the form of a string you can format that data to suit to your
needs.
2) HoroClient.cs:- The Horoscope Web Service Consuming
Console Client
|
/* the Horoscope Web Service Consumer
Console Client
Compilation
csc /r:System.dll;System.Web.Services.dll;DailyHoro.dll
HoroClient,cs
*/
using System ;
using horo_service ;
//A class which consumes the Web Service
public class HoroClient {
public static void Main(string[] argv)
{
Console.WriteLine("Welcome to
Horoscope Client") ;
Console.Write("Enter you Zodiac
Sign:") ;
//Read the Input from the user
string sign = Console.ReadLine() ;
//Create a instance of the Proxy Class
DailyHoro dh = new DailyHoro() ;
//Make a Call on the Web Service Method "GetHoro"
and
//pass the Zodiac sign to it
string result = dh.GetHoro(sign) ;
Console.WriteLine("Horoscope for
"+sign+" on "+result.Substring(0,10)) ;
//Print the Prediction
Console.WriteLine(result.Substring(11)) ;
Console.WriteLine();
Console.WriteLine("Press Enter
to Exit") ;
Console.ReadLine() ;
}
}
|
Compile this code and you will get the Executable
"HoroClient.exe" which consumes our Web Service. Run the file to use the
service.
Conclusion
If you have gone through the article you will find that Writing
and Consuming Web Services on the .NET Platform is very easy. Also in case of our "Content Providers"
example Web Service can be very useful since the consumers take the
responsibility of how to format the Code. Also one useful point for the
consumers is that they have to write the code only once. In our examples the
Consumer Portals have to just write the code once, Their content gets updated
every time the content gets updated on the Web Service. Have you got some
extra coffee send it over to me ... my coffee is over and I am dam sleepy (so if
there are any errors in the code do let me know :) )!!!!!!
Points to Remember
1) Web Services are Applications Delivered over the Web. 2)
Web Services use HTTP protocol to communicate with its client. 3) Web
Services use SOAP encoded XML messages to communicate with its clients. 4)
Web Service clients can be anything from Web Pages to Applications to Devices
only criteria being the client can understand the and communicate over HTTP in
SOAP encoded XML messages. 5) WSDL is the description of a Web Service
generated automatically for all Web Services. 6) If you are using the .NET
platform to create a Client then use "WSDL.exe" to create a Proxy
class from the WSDL of the Web Service. 7) Once you have the Proxy class code,
compile it into a Library. 8) Use the Proxy class Library in your Clients to
call methods upon a Web Service. 9) Hey if
someone really implements this service for the public then please do let me
know, since I would have but I don't have the resources yet ....
|