Enterprise Software

Easily create custom Web services with .NET

.NET helps to simplify the process of creating and using custom Web services. Tony Patton walks you through the process of creating a Web service that returns data from a backend data source.

The .NET platform greatly simplifies the process of creating and using custom Web services. In this article, I'll show you how to develop your own service that returns data from a backend data source.

The components

The System.Web.Services namespace provides the necessary classes for creating custom Web services. Specifically, a Web service is derived from the WebServices class located within this namespace. In addition, a Web service is a class file that is created with the asmx file extension. Web service methods are exposed via the WebMethod attribute, which immediately precedes the method name. You must declare the method marked with this attribute as public.

An IDE such as Visual Studio .NET makes it easy to create a Web service with a few mouse clicks, but it's just as easy to use your favorite text editor. I use the latter method in this newsletter (i.e., I use Microsoft Notepad). A file is declared as a Web service with the following directive placed at the top of the file (just like the page director for ASP.NET pages):

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

The previous line declares the class within the file as a Web service written in C# using the specific class name. However, the language choice is up to each developer; you may use VB.NET, J#, or any other supported language.

Using the details we've covered, let's create a simple Web service that returns a value from a SQL Server database (the sample Northwind database).

In action

The next code listing creates a Web service that returns a numeric value from the Northwind database located on the SQL Server. This provides a layer of abstraction between the user and the database connection. The SQL Server connection is defined within a string constant, which is used to create a database connection object. A simple SQL select statement is applied to the database using the SQL SUM function. This returns a total as a string value. Also, an error is returned if a database connection problem is encountered with the database operations contained within a try/catch block.

<%@ WebService Language="C#"
Class="BuilderWebServices.BuilderWebServiceExample1" %>
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.Services;
namespace BuilderWebServices {
public class BuilderWebServiceExample1: WebService {
private const string sConn = "server=(local);Initial
Catalog=Northwind;UID=sa;PWD=";
private SqlConnection conn = null;
private SqlCommand comm = null;
[WebMethod]
public string GetTotalFreight() {
try {
conn = new SqlConnection(sConn);
conn.Open();
comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = "SELECT SUM(Freight) FROM Orders";
comm.CommandType = CommandType.Text;
if (comm.ExecuteScalar() == null) {
return "Database error";
} else {
return comm.ExecuteScalar().ToString();
} } catch (SqlException ex) {
return "Database error: " + ex.ToString();
} catch (Exception e) {
return e.ToString();
} finally {
if (conn.State == ConnectionState.Open) {
conn.Close();
} } } } }

Once you create the Web service file (BuilderWebServiceExample1.asmx in our example), you may place it on the Web server and call it directly to obtain its syntax. I called this sample on a test server using the following URL:

http://localhost/Service1.asmx

You may obtain the public method's syntax by using the following syntax:

http://localhost/Service1.asmx?op=GetTotalFreight

You may utilize the method with the following URL:

http://localhost/Service1.asmx/GetTotalFreight

When you call this method, the following XML returns this code:

<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://tempuri.org/">64942.6900</string>

Let's extend the example by adding a method that accepts a parameter.

Extending the functionality

Now you'll add a method that accepts a parameter and uses this parameter to locate a data element within the database. It accepts an employee id and locates the associated employee from the Employees table. Listing A

This method returns the matching employee's name if located; otherwise, it returns a message stating that the employee wasn't found. If an error occurs, it returns an error message. Here's an example of the data returned for a matching employee:

<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://tempuri.org/">Fuller, Andrew</string>

VB.NET equivalent

Listing B includes all the code for the VB.NET equivalent of the example code in this article. The main difference is the attribute before the class name declaring it as a Web service.

Easy to use

The .NET Framework simplifies many tasks, of which the creation and use of Web services is a prime example. The Framework makes this complicated Web standard available to all .NET developers with a few mouse clicks (if you're using Visual Studio .NET) or a standard file format via a standard text file.

TechRepublic's free .NET newsletter, delivered each Wednesday, contains useful tips and coding examples on topics such as Web services, ASP.NET, ADO.NET, and Visual Studio .NET. Automatically sign up today!

About Tony Patton

Tony Patton has worn many hats over his 15+ years in the IT industry while witnessing many technologies come and go. He currently focuses on .NET and Web Development while trying to grasp the many facets of supporting such technologies in a productio...

Editor's Picks

Free Newsletters, In your Inbox