您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> .net编程 >> 正文

ASP.NET教程:18.2 创建Web服务

作者:佚名    责任编辑:admin    更新时间:2022-06-22

class="area">

ASP.NET中创建一个Web服务与创建一个网页相似。但是Web服务没有用户界面,也没有可视化组件,并且Web服务仅包含方法。Web服务可以在一个扩展名为.asmx的文件中编写代码,也可以放在代码隐藏文件中。在Visual Studio 2008中,.asmx文件的隐藏文件创建在App_Code目录下。

一、Web服务文件的指令

Web服务文件中包括一个WebServices指令,该指令必须应用在所有Web服务中。语法代码如下:

折叠展开XML/HTML 代码复制内容到剪贴板
  1. <%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="Service" %>

其中,

★ Language属性:指定在Web services使用的语言。可以为.NET支持的任何语言,包括C#、Visual Basic和JScript。该属性是可选的,如果未设置该属性,编译器将根据类文件使用的扩展名推导出所使用的语言。

★ Class属性:指定实现Web services的类名,该服务在更改后第一次访问Web services时被自动编译。该值可以是任何有效的类名。该属性指定的类既可以存储在单独的代码隐藏文件中,也可以存储在与WebService指令相同的文件中。该属性是Web services必需的。

★ CodeBehind属性:指定Web services类的源文件的名称。

★ Debug属性:指示是否使用调试方式编译Web services。如果启用调试方式编译Web services,Debug属性则为true,否则为false。默认为false。在Visual Studio 2008中,Debug属性是由Web config文件中的一个输入值决定的,所以开发Web services时,该属性会被忽略。

二、Web服务代码隐藏文件

在代码隐藏文件中包含一个类,它是根据Web服务的文件名命名的。这个类有两个特性标签,WebService和WebServiceBinding。在该类中还有一个名为HelloWorld的模板方法,它将返回一个字符串。这个方法使用WebMethod特性修饰,该特性表示方法对于Web服务使用程序可用。

1.WebService特性

对于将要发布和执行的Web服务来说,WebService特性是可选的。可以使用WebService特性为Web服务指定不受公共语言运行库标识符规则限制的名称。

Web服务在成为公共之前,应该更改其默认的XML命名空间。每个XML Web services都需要唯一的XML命名空间来标识它,以便客户端应用程序能够将它与网络上的其他服务区分开来。http://tempuri.org/可用于正在开发中的Web服务,已发布的web服务应该使用更具永久性的命名空间。例如,可以将公司的Internet域名作为XML命名空间的一部分。虽然很多Web服务的XML命名空间与URL根相似,但是,它们无须指向Web上的某一实际资源(Web服务的XML命名空间是URL)。对于使用ASP.NET创建的Web服务,可以使用Namespace属性更改默认的XML命名空间。

例1 将WebService特性的XML命名空间设置为http://www.qqb4.com。代码如下:

折叠展开C# 代码复制内容到剪贴板
  1. using System;
  2. using System.Web.Services;
  3. [WebService(Namespace="http://www.QQb4.com/")]
  4. public class Service : System.Web.Services.WebService
  5. {
  6. public Service()
  7. {
  8. //如果使用设计的组件,请取消注释以下行
  9. //InitializeComponent();
  10. }
  11. [WebMethod]
  12. public string HelloWorld()
  13. {
  14. return "Hello World";
  15. }
  16. }

2.WebServiceBinding特性

按Web服务描述语言(WSDL)的定义,绑定类似于一个接口,原因是它定义一组具体的操作。每个Web services方法都是特定绑定中的一项操作。Web services方法是Web services的默认绑定的成员,或者是在应用于实现Web services的类的WebServiceBinding特性中指定绑定的成员。Web服务可以通过将多个WebServiceBinding特性应用于Web services来实现多个绑定。

3.WebMethod特性

Web serwces类包含一个或多个可在Web服务中公开的公共方法。这些Web services方法以WebMethod特性开头。为使用ASP.NET创建的Web服务中的某个方法添加此WebMethod特性后,就可以从远程Web客户端调用该方法。

WebMethod特性包括一些属性,这些属性可以用于设置特定Web方法的行为,语法如下:

折叠展开XML/HTML 代码复制内容到剪贴板
  1. [WebMethod(PropertyName=value)]

WebMethod特性提供以下属性:

★ BufferResponse属性

BufferResponse属性启用对WebServices方法响应的缓冲。当设置为true时,ASP.NET在将响应从服务器向客户端发送之前,对整个响应进行缓冲。当设置为false时,ASP.NET以16KB的块区缓冲响应。默认值为true。

★ CacheDuration属性

CacheDuration属性启用对Web servlces方法结果的缓存。ASP.NET将缓存每个唯一参数集的结果。该属性的值指定ASP.NET应该对结果进行多少秒的缓存处理。值为0时,则禁用对结果进行缓存。默认值为0。

★ Description属性

Description属性提供Web services方法的说明字符串。当在浏览器上测试Web服务时,该说明将显示在Web服务帮助页上。默认值为空字符串。

★ EnableSession属性

EnableSession属性设置为true,启用Web servlces方法的会话状态。一旦启用,Web servICes就可以从HttpContextCurrent.Session中直接访问会话状态集合,如果它是从WebService基类继承的,则可以使用WebService.Session属性来访问会话状态集合。默认值为false。

★ MessageName属性

Web服务中禁止使用方法重载。但是,可以通过使用MessageName属性消除由多个相同名称的方法造成的无法识别问题。

MessageName属性使Web服务能够唯一确定使用别名的重载方法。默认值是方法名称。当指定MessageName时,结果SOAP消息将反映该名称,而不是实际的方法名称。

三、创建一个简单的Web服务

下面通过一个实例,具体介绍如何创建Web服务。

例2 创建一个具有查询功能的Web服务。程序实现的主要步骤:(实例位置:网页ASP.NET 3.5教程案例资源\18\ch01)

(1)打开Visual Studio 2008开发环境,依次选择“文件”/“新建网站”命令,弹出“新建网站”对话框,在该对话框中选择“ASP.NET Web服务”模板,并命名为ch01。

(2)单击“确定”按钮,将会创建App_Code/Service.cs页面。

该页为Web服务的代码隐藏文件。它包含了自动生成的一个类,并生成一个名为HelloWorld的模板方法。它将返回一个字符串,代码如下。

折叠展开C# 代码复制内容到剪贴板
  1. using System;
  2. using System.Linq;
  3. using System.Web;
  4. using System.Web.Services;
  5. using System.Web.Services.Protocols;
  6. using System.Xml.Linq;
  7. using System.Data.OleDb;
  8. [WebService(Namespace = "http://tempuri.org/")]
  9. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  10. // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
  11. // [System.Web.Script.Services.ScriptService]
  12. public class Service : System.Web.Services.WebService
  13. {
  14. public Service()
  15. {
  16. //如果使用设计的组件,请取消注释以下行
  17. //InitializeComponent();
  18. }
  19. [WebMethod]
  20. public string HelloWorld()
  21. {
  22. return "Hello World";
  23. }
  24. }

(3)在代码中添加自定义的方法Select(),代码如下。

折叠展开C# 代码复制内容到剪贴板
  1. [WebMethod(Description = "输入联系人姓名,返回详细信息")]
  2. public string Select(string stuName)
  3. {
  4. //建立Access数据库连接
  5. OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db18.mdb"));
  6. //打开数据库连接
  7. conn.Open();
  8. //执行SQL语句
  9. OleDbCommand cmd = new OleDbCommand("select * from 联系人 where 名字='" + stuName + "'", conn);
  10. OleDbDataReader dr = cmd.ExecuteReader();
  11. string txtMessage = "";
  12. //读取数据
  13. if (dr.Read())
  14. {
  15. txtMessage = "名字:" + dr["名字"] + " ,";
  16. txtMessage += "地址:" + dr["地址"] + " ,";
  17. txtMessage += "公司名称:" + dr["公司名称"] + " ,";
  18. txtMessage += "头衔:" + dr["头衔"] + " ,";
  19. }
  20. else
  21. {
  22. if (String.IsNullOrEmpty(stuName))
  23. {
  24. txtMessage = "<Font Color='Blue'>请输入姓名</Font>";
  25. }
  26. else
  27. {
  28. txtMessage = "<Font Color='Red'>查无此人!</Font>";
  29. }
  30. }
  31. cmd.Dispose();
  32. dr.Dispose();
  33. conn.Dispose();
  34. return txtMessage; //返回查询信息