在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另外一种分布式技术——Web Servicesweb
Web Services是支持客户端与服务器经过网络互操做的一种软件系统,是一组能够经过网络调用的应用程序API。在Web Services中主要到SOAP/UDDI/WSDL这三个核心概念,下面分别介绍下这三个概念的定义。数据库
它包括四个部分:安全
SOAP封装:它定义了一个框架,描述消息中的内容是描述,是谁发送的,谁又应当接收并处理;服务器
SOAP编码规则:定义了一种序列化的机制,用于表示应用程序须要使用的数据类型的实例;网络
SOAP RPC:表示一种协定,用于表示远程过程调用和应答;框架
SOAP绑定:它定义了SOAP使用哪一种协议来进行交换信息。使用Http/TCP/UDP均可以。与WCF中的绑定概念一致。分布式
换句话说,SOAP协议只是用来封装消息用的,封装后的消息你能够经过各类已有的协议来传输,如Http、Https、Tcp、UDP、SMTP等,甚至你还能够自定义协议。然而Web Service是采用基于Http协议来传输数据的。关于使用Https协议来访问Web Services的方法能够参考这个文章:如何利用 SSL 调用 Web 服务。测试
调用Web Services的实现过程与进行常规方法调用过程相似。不一样的在于,前者方法并不位于客户端应用程序中,而是经过指定传输协议生成请求消息。由于Web Services可能位于不一样的计算机上,所以必须将Web Services处理请求所需的信息经过网络传递给含有Web Services的服务器,Web Services在处理信息后,会经过网络将结果发送回客户端应用程序。下图显示了客户端与Web Services之间的通讯过程:网络传输协议
下面介绍下调用Web Services时事件发生顺序:编码
通过上面详细的介绍后,Web Services很明显具备如下优势:
Web Services也具备如下缺点:
使用Web Services来开发分布式应用较MSMQ和.NET Remoting来讲相对简单不少,今天的示例程序分三步走:
1 namespace WebServiceUserValidation 2 { 3 public class UserValidation 4 { 5 // 判断用户名和密码是否有效 6 public static bool IsUserLegal(string name, string psw) 7 { 8 // 用户能够访问数据库进行用户和密码验证 9 // 这里仅仅做为演示 10 string password = "LearningHard"; 11 if (string.Equals(password, psw)) 12 { 13 return true; 14 } 15 else 16 { 17 return false; 18 } 19 } 20 21 // 判断用户的凭证是否有效 22 public static bool IsUserLegal(string token) 23 { 24 // 用户能够访问数据库进行用户凭证验证 25 // 这里只作演示 26 string password = "LearningHard"; 27 if (string.Equals(password, token)) 28 { 29 return true; 30 } 31 else 32 { 33 return false; 34 } 35 } 36 } 37 }
2. 建立Web Services服务类,须要建立一个继承自SoapHeader,来接收SOAP 头里的消息,并添加WebServiceUserValidation程序集。经过添加Asp.net 空Web应用程序来建立Web Services服务工程,再右键建立的Web 应用程序工程添加一个Web 服务文件来建立Web 服务。具体的实现代码以下所示:
1 // 用户自定义的SoapHeader类必须继承于SoapHeader 2 public class MySoapHeader : SoapHeader 3 { 4 // 存储用户凭证 5 public string Token { get; set; } 6 } 7 /// <summary> 8 /// LearningHardWebService 的摘要说明 9 /// </summary> 10 [WebService(Namespace = "http://www.cnblogs.com/zhili/")] 11 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 12 [System.ComponentModel.ToolboxItem(false)] 13 // 若要容许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释如下行。 14 // [System.Web.Script.Services.ScriptService] 15 public class LearningHardWebService : System.Web.Services.WebService 16 { 17 // 存储用户凭证的Soap Header信息 18 // 必须保证是public和字段名必须与SoapHeader("memberName")中memberName同样 19 // 不然会出现“头属性/字段 LearningHardWebService.authenticationToken 缺失或者不是公共的。”的异常 20 public MySoapHeader authenticationToken; 21 private const string TOKEN = "LearningHard"; // 存储服务器端凭证 22 23 24 // 定义SoapHeader传递的方向 25 //SoapHeaderDirection.In;只发送SoapHeader到服务端,该值是默认值 26 //SoapHeaderDirection.Out;只发送SoapHeader到客户端 27 //SoapHeaderDirection.InOut;发送SoapHeader到服务端和客户端 28 //SoapHeaderDirection.Fault;服务端方法异常的话,会发送异常信息到客户端 29 [SoapHeader("authenticationToken", Direction = SoapHeaderDirection.InOut)] 30 [WebMethod(EnableSession = false)] 31 public string HelloLearningHard() 32 { 33 if (authenticationToken != null && UserValidation.IsUserLegal(authenticationToken.Token)) 34 { 35 return "LearningHard 你好,调用服务方法成功!"; 36 } 37 else 38 { 39 throw new SoapException("身份验证失败", SoapException.ServerFaultCode); 40 } 41 } 42 }
在上面代码中须要注意的是,Web Servies中的Web方法须要抛出SoapExcetion异常才能被客户端捕获到,若是在Debug模式下调试运行的话,还须要在异常设置里把这个异常勾选掉,即编译器不对该异常进行捕获。
3. 建立控制台客户端,经过添加服务引用的方式来添加Web Services,添加成功后,会在客户端程序中建立一个代理类,客户端能够经过该代理类来调用Web Services的方法,具体的实现代码以下所示:
1 namespace WebServiceClient 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 // 实例化一个Soap协议的头 8 MySoapHeader mySoapHeader = new MySoapHeader() { Token = "LearningHard"}; 9 string sResult = string.Empty; 10 LearningHardWebServiceSoapClient learningHardWebSer = null; 11 try 12 { 13 // 实例化Web服务的客户端代理类 14 learningHardWebSer = new LearningHardWebServiceSoapClient(); 15 // 调用Web服务上的方法 16 sResult= learningHardWebSer.HelloLearningHard(ref mySoapHeader); 17 // 输出结果 18 Console.WriteLine(sResult); 19 } 20 catch 21 { 22 Console.WriteLine("调用Web服务失败!"); 23 } 24 finally 25 { 26 // 释放托管资源 27 if (learningHardWebSer != null) 28 { 29 learningHardWebSer.Close(); 30 } 31 } 32 33 Console.WriteLine("请按任意键结束..."); 34 Console.ReadLine(); 35 } 36 } 37 }
关于Web Services异常捕获的更多信息能够参考MSDN:在 XML Web services 中处理和引起异常。然而在这个MSDN上的示例代码好像运行不成功,后面发现,该文章中的客户端对异常的处理只处理了SoapException 异常,而此时客户端触发的异常时FaultException异常,因此异常处理代码应像下面代码同样处理,固然也能够直接只处理Exception异常,我上面代码就只处理这个大范围的异常。
catch (SoapException ex) { // Do sth with SoapException } catch (Exception ex) { // Do sth with Exception }
通过上面的步骤,咱们就已经完成了全部的开发工做,下面运行来测试下该程序的运行效果。把WebServiceClient做为启动项目,直接按F5或Ctrl+F5来运行客户端程序,你将看到以下所示的结果:
注:像通常分布式应用程序,都应用先运行服务器端,再运行客户端来访问服务方法。而这里咱们运行却直接运行客户端就能够访问Web Services中的Web方法了。这是由于在运行Web Services客户端程序以前,会先把Web Services部署到IIS Express 中,你将会看到任务栏右下角有,右键该图标就能够看到运行的Web Services。
到这里,Web Services技术的分享就结束,从下一篇文章开始,将正式进入WCF的世界。而Web Services的内容和WCF内容同样也有不少,只是微软官方推荐采用WCF来建立Web服务程序,若是你想更多地了解Web Services的内容,能够参考MSDN:使用 ASP.NET 建立的 XML Web Services 以及 XML Web Services 客户端