To illustrate the techniques used to implement a web service in C# using the services classes of the .NET Framework, let’s build a simple calculator and then make use of its functions over the Web.
You begin by specifying the web service. You do so by defining a
class that inherits from
System.Web.Services.WebService
. The easiest way to
create this class is to open Visual Studio and create a new C# Web
Service project. The default name that Visual Studio provides is
WebService1
, but you might want to choose
something more appropriate.
Visual Studio .NET creates a skeleton web service and even provides a Web Service example method for you to replace with your own code, as shown in Example 16-1.
Example 16-1. Skeleton web class generated by Visual Studio .NET
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services; namespace WSCalc { /// <summary> /// Summary description for Service1. /// </summary> public class Service1 : System.Web.Services.WebService { public Service1( ) { //CODEGEN: This call is required by the ASP.NET Web Services Designer InitializeComponent( ); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent( ) { } #endregion /// <summary> /// Clean up any resources being used. /// </summary> public override void Dispose( ) { } // WEB SERVICE EXAMPLE // The HelloWorld( ) example service //returns the string Hello World // To build, uncomment the following lines // then save and build the project // To test this web service, press F5 // [WebMethod] // public string HelloWorld( ) // { // return "Hello World"; // } } }
You’ll create five methods: Add( )
,
Sub( )
,
Mult( )
, Div( )
,
and
Pow( )
. Each takes two parameters of type
double
, performs the requested operation, and then
returns a value of the same type. For example, here is the code for
raising a number to some specified power:
public double pow(double x, double y) { double retVal = x; for (int i = 0;i < y-1;i++) { retVal *= x; } return retVal; }
To expose each method as a web service, you simply add the
[WebMethod]
attribute before each method
declaration:
[WebMethod]
Attributes are discussed in Chapter 18.
You are not required to expose all the methods of your class as web
services. You can pick and choose, adding the
[WebMethod]
attribute only to those methods you
want to expose.
That’s all you need to do; .NET takes care of the rest.
Example 16-2 shows the complete source code for the Calculator web service:
Example 16-2. Calculator web service program
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services; namespace WSCalc { [WebService(Namespace="http://www.libertyAssociates.com/webServices/")] public class Service1 : System.Web.Services.WebService { public Service1( ) { InitializeComponent( ); } #region Component Designer generated code private void InitializeComponent( ) { } #endregion public override void Dispose( ) { } [WebMethod] public double Add(double x, double y) { return x+y; } [WebMethod] public double Sub(double x, double y) { return x-y; } [WebMethod] public double Mult(double x, double y) { return x*y; } [WebMethod] public double Div(double x, double y) { return x/y; } [WebMethod] public double pow(double x, double y) { double retVal = x; for (int i = 0;i < y-1;i++) { retVal *= x; } return retVal; } } }
The only special work you must do is to add references to both
System.Web
and
System.Web.Services
. If you build your application
using command-line tools, you would use the /R
flag to add the references. In Visual Studio .NET, you simply
right-click the Solution Explorer window, select References, and add
the appropriate namespace references from the .NET tab. You must also
add the appropriate using
statements to the top of
the file, as shown in Example 16-2.
When you build this project with Visual Studio .NET, a DLL is created
in the appropriate subdirectory of your Internet server (e.g.,
c:InetPubwwwrootProgCSharpWebSvc
). A quick
check of that directory reveals that a .disco
file has also been added.
There is nothing magical about using Visual Studio .NET; you can create your server in Notepad if you like. Visual Studio .NET simply saves you the work of creating the directories, creating the .disco file, and so forth. Visual Studio .NET is particularly helpful when creating the client files, as you’ll see shortly.
If you open a browser to your web service’s URL (or invoke the browser by running the program in Visual Studio .NET), you get an automatically generated, server-side web page that describes the web service, as shown in Figure 16-1. Test pages such as this offer a good way to test your web service. (The next section illuminates the seeming hocus-pocus that produces these pages.)
Clicking a method brings you to a page that describes the method and allows you to invoke it by typing in parameters and pressing the Invoke button. Figure 16-2 illustrates.
If you type 3
into the first value field and
4
into the second field, you will have asked the
web service to raise 3
to the fourth power. The
result is an XML page describing the output, as shown in Figure 16-3.
Notice that the URL encodes the parameters of 3
and 4
, and the output XML shows the result of
81
(3*3*3*3 = 81
).
A lot of work is being done for you automatically. HTML pages describing your web service and its methods are generated, and these pages include links to pages in which the methods can be tested. How is this done?
As noted earlier, the web service is described in WSDL. You can see
the WSDL document by appending ?WSDL
to the web
service URL, like this:
http://localhost/webForms/WSCalc/Service1.asmx?wsdl
The browser displays the WSDL document, as shown in Figure 16-4.
The details of the WSDL document are beyond the scope of this book, but you can see that each method is fully described in a structured XML format. This is the information used by SOAP to allow the client browser to invoke your web service methods on the server.
18.226.163.229