Web服务(Web Services),其实就是一种无须购买并部署的组件,是一种被一次部署到Internet中然后到处可用的一种新型组件,所有应用只需要能够连入Internet,就可以使用和集成Web服务。
Web服务基于一套描述软件通信语法和语义的核心标准。XML提供表示数据的通用语法;简单对象访问协议(SOAP)提供数据交换的语义;Web服务描述语言(WSDL)提供描述Web服务功能的机制。其他规范统称为WS-*体系结构,用于定义Web服务发现、事件、附件、安全性、可靠的消息传送、事务和管理方面的功能。
Web服务提供了定义良好的接口,这些接口描述了它所提供的服务,用户可以通过这些接口来调用Web服务提供的功能。开发者可以通过把远程服务、本地服务和用户代码结合在一起来创建应用程序。
Web服务既可以在内部由单个应用程序使用,也可通过Internet公开供任意数量的应用程序使用。由于可以通过标准接口访问,因此Web服务使异构系统能够作为一个计算网络协同运行。
Web服务正在开创一个分布式应用程序开发的新时代。作为Internet的下一个革命性的进步,Web服务将成为把所有计算设备链接到一起的基本结构。
Web服务的设计是基于兼容性很强的开放式标准。为了确保最大限度的兼容性和可扩展性,Web服务体系被建设得尽可能通用。
Web服务的标准如下:
1.WSDL:告诉客户端一个Web服务中都提供了什么方法,这些方法包含什么参数、将要返回什么值以及如何与这些方法进行交互。
2.SOAP:在信息发送到一个Web服务之前,提供对信息进行编码的标准。
3.HTTP:所有的Web服务交互发生时所遵循的协议。
4.DISCO:该标准提供包含对Web服务的链接或以一种特殊的途径来提供Web服务的列表。
5.UDDI:这个标准提供创建业务的信息。
SOAP
在.NET中,客户端在与Web服务交互时有下面三种协议能够使用:
1.HTTP GET:使用该协议与Web服务交互时,会把客户端发送的信息编码后放在查询字符串里,而客户端获取的Web服务的信息则是以一个基本的XML文档的形式存在。
2.HTTP POST:使用该协议与Web服务交互时,会把参数放在请求体里面,而获取的信息则是以一个基本的XML文档的形式存在。
3.SOAP:使用该协议与Web服务交互时,请求和获取的信息都是以XML形式存在。同HTTP GET和HTTP POST一样,SOAP也是运行于HTTP之上,但它绑定信息则是采用一个更详细的基于XML的语言来描述。
尽管.NET有能力支持以上三种协议,但是为了安全,通常会限制使用前两种协议。默认情况下,.NET禁用HTTP GET,而且对于本地计算机限制HTTP POST。这意味着程序员可以使用前两种协议测试Web服务,但不能使用它们来访问一个远程计算机上的Web服务。可以在Web.Config文件里改变这些设置,但.NET不推荐这样做。
从本质上来说,当使用SOAP时,程序员只需要简单的使用SOAP标准来编码信息即可。
与Web服务交互
WSDL和SOAP标准使得Web服务同客户端的交互成为可能,但它们没有说明如何进行交互。以下三个组件在Web服务同客户端的交互中扮演重要角色:
1.一个定制的Web服务类,该类提供一些功能。
2.一个客户端应用程序,该程序使用上面组件的功能。
3.一个代理类,该类扮演上面两个组件间的接口角色。该代理类包含所有Web服务方法的说明,而且根据选择的协议处理所有与Web服务交互相关的细节问题。
实际交互过程的执行步骤:
1.客户端创建一个代理类的实例。
2.客户端调用代理类的方法。
3.在后台,代理类以恰当的形式发送信息到Web服务,并且接收相应的反应信息。
4.代理类返回调用代码的结果。
在使用交互过程中需要注意以下内容:
1.并不是所有的数据类型都支持方法参数和返回值。如大部分.NE类对象都不能在该交互过程中被传递(DataSet除外)。
2.网络调用花费很少的但可计量的时间。如果需要在一行代码中使用几个Web服务方法,则这个延迟会被累加的。
3.除非Web服务采用特殊步骤来记忆状态,状态数据会被丢失的。这意味着程序员应该把Web服务看成是一个无状态的实用类,而该类包含很多程序员需要使用的方法。
4.在与Web服务的交互中,会出现错误且可能被中断。程序员在构建一个健壮的应用程序时要考虑到很多因素。
创建Web服务
创建Web服务的步骤:
1. 右键点击网站名称。在弹出的快捷菜单中选择“添加新项”命令。
2. 在弹出的“添加新项”选择“已安装模板”下的“Visual C#”模板,并在模板文件列表中选中“Web 服务”,然后在“名称”文本框输入该文件的名称“WebService.asmx”,单击“添加”按钮。
3. 在解决方案资源管理器中出现Web服务的文件。
在ASP.NET中,所有的Web服务类都会继承于System.Web.WebService类。该类包含一个构造函数,一般情况下可以不需要改构造函数。
WebMethod用来提供描述它所标识的方法的接口,WebMethod的属性如下:
1.Description:Web服务的方法的描述信息、对Web服务的方法的功能注释。
2.EnableSession:指示Web服务是否启动Session标志,主要通过Cookie完成,默认为false。
3.MessageName:主要实现方法重载后的重命名。
4.TransactionOption:指示XML Web services方法的事务支持。
5.CacheDuration:指定缓存时间的属性。
6.BufferResponse:配置Web服务的方法是否等到响应被完全缓冲后,才发送信息给请求端。
创建Web服务中的方法
利用上述步骤创建Web服务WebService1.asmx,修改WebService1.asmx.cs中的代码,如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Data.SqlClient; 5 using System.Linq; 6 using System.Web; 7 using System.Web.Services; 8 9 namespace WebApplication1 10 { 11 /// <summary> 12 /// WebService1 的摘要说明 13 /// </summary> 14 [WebService(Namespace = "http://tempuri.org/")] 15 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 16 [System.ComponentModel.ToolboxItem(false)] 17 // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 18 // [System.Web.Script.Services.ScriptService] 19 public class WebService1 : System.Web.Services.WebService 20 { 21 22 [WebMethod(Description="获取学生信息")] 23 public DataSet GetStudent(string name) 24 { 25 if (name == "") 26 return null; 27 DataSet dataSet = new DataSet("Student"); 28 string connString = "Data Source=追风的蜗牛;Initial Catalog=Student;Integrated Security=True"; 29 string sql = "select * from Student where stuName='" + name + "'"; 30 SqlConnection sqlConnection = new SqlConnection(connString); 31 try 32 { 33 SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sql, sqlConnection); 34 sqlConnection.Open(); 35 sqlDataAdapter.Fill(dataSet); 36 return dataSet; 37 } 38 catch 39 { 40 sqlConnection.Close(); 41 return null; 42 } 43 } 44 } 45 }
使用存在的Web服务
右键单击项目名称,为项目添加服务引用,选择此解决方案中的Web服务,选择刚刚创建的Web服务。
添加页面Default.aspx,添加一个DetailsView控件,Default.aspx.cs中的代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Data; 4 using System.Linq; 5 using System.Web; 6 using System.Web.UI; 7 using System.Web.UI.WebControls; 8 9 namespace WebApplication1 10 { 11 public partial class Default : System.Web.UI.Page 12 { 13 protected void Page_Load(object sender, EventArgs e) 14 { 15 WebService1 server1 = new WebService1(); 16 DataSet dataSet = server1.GetStudent("吴彤"); 17 if (dataSet != null) 18 { 19 this.DetailsView1.DataSource = dataSet.Tables[0].DefaultView; 20 this.DetailsView1.DataBind(); 21 } 22 } 23 } 24 }