Case studies in C#: Web service of a bookshop
Notes:

<%@ WebService Language="C#" Class="BookStoreService"%>
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections;

public class Book {
public string author;
public string title;
public int price;
public Book(string a, string t, int p) {
author = a; title = t; price = p;
}
}

public class BookStoreService: WebService {
Hashtable books = new Hashtable();

public BookStoreService() {
books["0201485419"] = new Book("D.Knuth", "The Art of Computer Programming", 45);
books["0201066726"] = new Book("R.Sedgewick", "Algorithms", 32);
books["0201634465"] = new Book("D.Box", "Essential COM", 34);
}

[WebMethod]
public bool Available(string isbn) {
return books[isbn] != null;
}

[WebMethod]
public string Author(string isbn) {
object obj = books[isbn];
if (obj == null) return ""; else return ((Book)obj).author;
}

[WebMethod]
public string Title(string isbn) {
object obj = books[isbn];
if (obj == null) return ""; else return ((Book)obj).title;
}

[WebMethod]
public int Price(string isbn) {
object obj = books[isbn];
if (obj == null) return 0; else return ((Book)obj).price;
}

}

Note: The aspx file must be stored in a virtual directory of the web server
or in one of its subdirectories.

We can now test our web service by pointing the web browser to
    

http://dotnet.jku.at/csbook/solutions/19/BookStoreService.asmx

With
    

http://dotnet.jku.at/csbook/solutions/19/BookStoreService.asmx?WSDL

we get a WSDL description of our web service.

In order to make the web service available for other programs we must
generate a proxy class from it using wsdl.exe:

  wsdl /out:BookStoreService.cs http://dotnet.jku.at/csbook/solutions/19/BookStoreService.asmx?WSDL

The proxy class of our example looks as follows:

/csbook/solutions/19/BookStoreService.cs


//------------------------------------------------------------------------------
//
// This code was generated by a tool.
// Runtime Version: 1.0.3705.288
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
//
//------------------------------------------------------------------------------

//
// This source code was auto-generated by wsdl, Version=1.0.3705.288.
//
using System.Diagnostics;
using System.Xml.Serialization;
using System;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.Services;


///
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="BookStoreServiceSoap",
Namespace="http://tempuri.org/")]
public class BookStoreService : System.Web.Services.Protocols.SoapHttpClientProtocol {

///
public BookStoreService() {
this.Url = "http://dotnet.jku.at/csbook/solutions/19/BookStoreService.asmx";
}

///
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Available",
RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public bool Available(string isbn) {
object[] results = this.Invoke("Available", new object[] {
isbn});
return ((bool)(results[0]));
}

///
public System.IAsyncResult BeginAvailable
(string isbn, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("Available", new object[] {
isbn}, callback, asyncState);
}

///
public bool EndAvailable(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((bool)(results[0]));
}

///
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Author",
RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public string Author(string isbn) {
object[] results = this.Invoke("Author", new object[] {
isbn});
return ((string)(results[0]));
}

///
public System.IAsyncResult BeginAuthor
(string isbn, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("Author", new object[] {
isbn}, callback, asyncState);
}

///
public string EndAuthor(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((string)(results[0]));
}

///
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Title",
RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public string Title(string isbn) {
object[] results = this.Invoke("Title", new object[] {
isbn});
return ((string)(results[0]));
}

///
public System.IAsyncResult BeginTitle
(string isbn, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("Title", new object[] {
isbn}, callback, asyncState);
}

///
public string EndTitle(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((string)(results[0]));
}

///
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/Price",
RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/",
Use=System.Web.Services.Description.SoapBindingUse.Literal,
ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public int Price(string isbn) {
object[] results = this.Invoke("Price", new object[] {
isbn});
return ((int)(results[0]));
}

///
public System.IAsyncResult BeginPrice
(string isbn, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("Price", new object[] {
isbn}, callback, asyncState);
}

///
public int EndPrice(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((int)(results[0]));
}
}

Next, we must write a main program that calls the web service via the
proxy class. For example, the following program reads commands of the kind:

  price 0201485419
title 0201485419
author 0201485419

and calls the appropriate methods of the web service:

/csbook/solutions/19/BookStoreTest.cs

using System;

public class BookStoreTest {

public static void Main() {
BookStoreService store = new BookStoreService();
for (;;) {
Console.Write(">");
string cmd = Console.ReadLine();
if (cmd == "") return;
string isbn;
if (cmd.StartsWith("price")) {
isbn = cmd.Substring(6).Trim();
Console.WriteLine("price = {0}", store.Price(isbn));
} else if (cmd.StartsWith("author")) {
isbn = cmd.Substring(7).Trim();
Console.WriteLine("author = {0}", store.Author(isbn));
} else if (cmd.StartsWith("title")) {
isbn = cmd.Substring(6).Trim();
Console.WriteLine("title = {0}", store.Title(isbn));
} else if (cmd.StartsWith("avail")) {
isbn = cmd.Substring(6).Trim();
if (store.Available(isbn)) Console.WriteLine("available");
else Console.WriteLine("not available");
}
}
}
}

Finally, we compile both files with the following command:

  csc BookStoreService.cs BookStoreTest.cs


Average: 5 (1 vote)
Related Links:Web Services in C#: Several scenarios in which web services could be useful.Case studies in C#: CalculatorC#C# AssembliesCase studies in C#: Web interface using ASP.NET
© Copyright 2008. All Rights Reserved.