Creating and Consuming a Web Service, Part 2By Scott Mitchell
In Part 1 we examined how to create a Web Service to expose the categories and FAQs of ASPFAQs.com. In this part we'll look at how to use Visual Studio .NET to write an ASP.NET Web page to consume the Web Service.
Consuming a Web Service
For a Web site to consume a Web Service, a rather complicated and terse communication must occur between the client Web site (henceforth referred to as the "consumer") and the Web site that is providing the Web service (henceforth the "producer"). Essentially, the consumer must decide what producer's method it wishes to call. If there are input parameters, these parameters must be converted into XML to be passed along. An HTTP request is then made from the consumer to the producer, specifying the method it wishes to call and passing along the parameters in either a SOAP request, through the QueryString, or in the POST headers.
The producer receives the incoming request, unpackages the input parameters, and calls the appropriate method of the specified class. This method, when complete, returns some value, which is packaged up and sent back to the consumer in an HTTP response. The consumer receives this response, unpackages the return value, completing the Web Service call.
Clearly we'd like to not have to worry about the HTTP message passing semantics at all when using Web Services. In order to remove this as a concern, we use what is called a Proxy class. Proxy classes serve as an intermediate step between the program (or Web page) on the consumer and the actual Web service on the producer. For each method in the producer's Web Service, there is a method in the Proxy class. It is the responsibility of the Proxy class to do all of the complicated message-passing tasks; essentially this complexity is hidden in the class, our Web page can simply call the methods of this class and not concern itself with the underlying semantics involved in calling a Web Service.
What in the World did he just Say?
By this point you're likely thoroughly confused, and that's understandable, this can be a confusing topic. The fundamental thing to understand is that the HTTP communications that must occur between a consumer and producer when calling a Web Service can be complicated and require much code. We'd prefer to have our Web pages that utilize Web Services be able to invoke the Web Service just as if it were a local component. In order to accomplish this, a Proxy class is used, whose public interface mirrors that of the Web Service. If you are still confused, consider viewing this PowerPoint presentation, which illustrates how to consume a Web Service. (Note that it shows how to create the Proxy class from the command-line; in this article we'll be using Visual Studio .NET.)
Creating the Proxy Class in Visual Studio .NET
Creating a Proxy class for a Web Service is a breeze in Visual Studio .NET. In your ASP.NET Web Project, simply right click on the References icon and choose to "Add a Web Reference." A dialog box will appear asking you for a URL - simply enter the URL of the Web Service, such as:
https://aspnet.4guysfromrolla.com/ws/ASPFAQs.asmx. You will then see the description of the Web Service (just as if you had visited the URL directly through your Web browser). To complete this task, click the "Add Reference" button, which will automatically create the Proxy class for you and compile it.
When added to your project the Proxy class's namespace will likely be the URL of your site, for example:
com.4guysfromrolla.aspnet. (You can rename this if you so choose.)
To call the Web Service from a Web page you use the Proxy class like you would any other local component.
Imagine that we wanted to display a list of the FAQs from the ASP.NET category (which has category ID 22).
We could do this by making a call to the
GetFAQsInCategory method of the Web Service, passing
in the parameter 22, and binding the resulting DataSet to a DataGrid, like so:
From simply examining the code you could not determine that the call to the
Proxy class is, in actuality, a remote Web service call. When the Proxy class's
GetFAQsInCategory method is called, the complex communications discussed previously occur
(the remote HTTP request/response dialogue).
|Creating a Proxy Class without Visual Studio .NET|
|Creating a Proxy class through Visual Studio .NET is very easy; however, if you don't have Visual Studio .NET, you can still create Proxy classes, but you must do so through the command-line. For more information on this technique be sure to read the PowerPoint presentation: Calling a Web Service from an ASP.NET Web Page.|
In this article we examined how to create a Web Service and then how to consume it from an ASP.NET Web page using Visual Studio .NET. Microsoft has really simplified the process of producing and consuming Web Services with .NET. Creating a Web Service is as simple as creating a
.asmxfile and writing the code for the Web Service methods - save for the
<WebMethod()>macros, the code appears nearly identical to the code one would write for a local component. Consuming a Web Service is painfully simple too, thanks to the use of Proxy classes. On top of that, the creation of Proxy classes is utterly simple through tools such as Visual Studio .NET.