热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> XML编程>>正文内容

XML Web Service示例

发布时间:2011年03月18日点击数: 佚名

对于初识XML Web Service并想快速上手的人,可能希望快速了解它的创建和调用方法。本文将用一个小例子来讲述如何用Visual Studio 2008来创建Web Service以及如何来调用它。例子中的Web Service将根据客户程序的请求来返回一幅图像。

1. 创建Web Service项目

打开VS2008,选择File/New/Project菜单项,在打开的New Project对话框中,依次选择Visual C# -> Web -> ASP.NET Web Service Application,然后输入项目名称(Name),存放位置(Position)和解决方案名称(Solution Name),点击“OK”生成项目。此例中我们用AnnotationWebService作为项目和解决方案的名称(见图1)。

XML Web Service示例(图1)

1New Project对话框

2. 增加一个Web Service

VS2008Solution Explorer中点击AnnotationWebService项,选择Project/Add new item菜单项,在打开的Add New Item对话框中,依次选择Web/Web Service,然后输入Web Service的名称(Name),点击“Add”来增加一个Web Service。此例中我们用ImageService作为Web Service的名称(见图2)。

XML Web Service示例(图2)

2Add New Item对话框

之后,我们在Solution Explorer中会看到这样的项目目录(见图3)。(注意:系统在创建项目时会缺省地增加一个Web Service,名字为Service1,可以点击其右键菜单中的Delete项将其删除。)

XML Web Service示例(图3)

3Solution Explorer

3. Web Service编码

右键点击ImageService.asmx,选择View Markup,可以打开此文件,我们可以看到如下一行:

<%@ WebService Language="C#" CodeBehind="ImageService.asmx.cs" Class="AnnotationWebService.ImageService" %>

它指示ImageService的代码在ImageService.asmx.cs文件中。我们右键点击ImageService.asmx,选择View Code,打开ImageService.asmx.cs文件,增加我们的服务代码,此例中,我们编写一个根据给定的文件名读取图像并返回给客户端的方法GetImage(见下面代码)。

  1. using System.IO;  
  2.  
  3. using System.Web;  
  4.  
  5. using System.Web.Services;  
  6.  
  7. using System.Web.Services.Protocols;  
  8.  
  9.    
  10.  
  11. namespace AnnotationWebService  
  12.  
  13. {  
  14.  
  15.     /// <summary>  
  16.  
  17.     /// Summary description for ImageService  
  18.  
  19.     /// </summary>  
  20.  
  21.     [WebService(Namespace = "http://tempuri.org/")]  
  22.  
  23.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
  24.  
  25.     [System.ComponentModel.ToolboxItem(false)]  
  26.  
  27.     // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.   
  28.  
  29.     // [System.Web.Script.Services.ScriptService]  
  30.  
  31.     public class ImageService : System.Web.Services.WebService  
  32.  
  33.     {  
  34.  
  35.    
  36.  
  37.         [WebMethod(Description="Request an image by name")]  
  38.  
  39.         public byte[] GetImage(string imageFileName)  
  40.  
  41.         {  
  42.  
  43.             byte[] imageArray = GetBinaryFile(imageFileName);  
  44.  
  45.             if (imageArray.Length < 2)  
  46.  
  47.             {  
  48.  
  49.                 throw new SoapException("Could not open image on server.", SoapException.ServerFaultCode);  
  50.  
  51.             }  
  52.  
  53.             else 
  54.  
  55.             {  
  56.  
  57.                 return imageArray;  
  58.  
  59.             }  
  60.  
  61.         }  
  62.  
  63.    
  64.  
  65.         private byte[] GetBinaryFile(string fileName)  
  66.  
  67.         {  
  68.  
  69.             string fullPathFileName = HttpContext.Current.Request.PhysicalApplicationPath + fileName;  
  70.  
  71.             if (File.Exists(fullPathFileName))  
  72.  
  73.             {  
  74.  
  75.                 try 
  76.  
  77.                 {  
  78.  
  79.                     FileStream fileStream = File.OpenRead(fullPathFileName);  
  80.  
  81.                     return ConvertStreamToByteBuffer(fileStream);  
  82.  
  83.                 }  
  84.  
  85.                 catch 
  86.  
  87.                 {  
  88.  
  89.                     return new byte[0];  
  90.  
  91.                 }  
  92.  
  93.             }  
  94.  
  95.             else 
  96.  
  97.             {  
  98.  
  99.                 return new byte[0];  
  100.  
  101.             }  
  102.  
  103.         }  
  104.  
  105.    
  106.  
  107.         public byte[] ConvertStreamToByteBuffer(Stream imageStream)  
  108.  
  109.         {  
  110.  
  111.             int imageByte;  
  112.  
  113.             MemoryStream tempStream = new MemoryStream();  
  114.  
  115.             while ((imageByte = imageStream.ReadByte()) != -1)  
  116.  
  117.             {  
  118.  
  119.                 tempStream.WriteByte((byte)imageByte);  
  120.  
  121.             }  
  122.  
  123.             return tempStream.ToArray();  
  124.  
  125.         }  
  126.  
  127.     }  
  128.  
  129. }  
  130.  

4. IIS中增加虚拟目录(Virtual Directory)

打开IIS控制台程序,右键点击Default Web Site,选择增加New/Virtual Directory菜单项,在打开的Virtual Directory Caption Wizard对话框中输入虚拟目录别名(Alias),此例中我们输入AnnotationWebService,点击“Next”,再选择ImageService.asmx所在的目录,再点击“Next”直到“Finish”。(注:以上描述是基于XP SP3环境。)

5. Web Service创建代理(Proxy)

VS2008中,打开一个Windows应用程序解决方案(.sln),此例中我们打开一个叫做AnnotationApp的解决方案。在要调用Web Service的项目上(比如此例中我们选择用DataLib)点击右键,选择Add Web Reference菜单项(如果从未添加过Web Reference,可能会看不到Add Web Reference菜单项,我们可以先选择Add Service Reference菜单项,在弹出的Add Service Reference对话框中点击“Advanced”,再在弹出的Service Reference Settings对话框里点击“Add Web Reference”),在弹出的Add Web Reference对话框中,输入我们要调用的Web ServiceURL,此例中我们输入:

http://localhost/AnnotationWebService/ImageService.asmx

然后点击“Go”,ImageService就会显示在下面的Web Page里,在Web reference name编辑框输入Web引用的名字,为了避免再用ImageService这个名字,这里我们输入ImageWebService(见图4),然后点击“Add Reference”来添加Web引用。

XML Web Service示例(图4)

4Add Web Reference对话框

这会在Solution Explorer中增加一个Web Reference(见图5)。

XML Web Service示例(图5)

5Web Reference被添加

添加的引用是Image Service的代理代码,其中包括一个与ImageService同名的类,派生于System.Web.Services.Protocols.SoapHttpClientProtocol。这样在客户代码中就可以像调用自己的Assembly里的方法一样调用ImageServiceGetImage方法。

6. 客户程序调用Web Service

在客户程序中需要调取图像的地方增加如下代码(注:代码中的Image类不是.Net Framework类库中的Image类,是客户程序中的一个类):

 

  1. ImageService imageService = new ImageService();  
  2.  
  3. Bitmap bitmap;  
  4.  
  5. try 
  6.  
  7. {  
  8.  
  9.     byte[] image = imageService.GetImage("half-bred panthers.jpg");  
  10.  
  11.     MemoryStream memoryStream = new MemoryStream(image);  
  12.  
  13.     bitmap = new Bitmap(memoryStream);  
  14.  
  15.     _image = new Image(_viewportTransformer, bitmap);  
  16.  
  17. }  
  18.  
  19. catch (WebException e)  
  20.  
  21. {  
  22.  
  23.     // Exception handling  
  24.  
  25. }  

然后,可以将图像显示出来。

7.运行客户程序来测试Web Service调用

编译运行客户程序,Web Service被成功调用并返回所调用的图像(见图6)。

XML Web Service示例(图6)

6:运行结果

本文参考了Stephen C. Perry编著的《Core C# and .Net》(C# 2.0)第18章“XML Web Service”。所述例子在Visual Studio 2008上实际编写并调试通过。

本站热点业务

更多模板/案例展示

热门推荐

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作