基础知识
发展进程:1.在Visual Studio 2005里提供的Add Web Reference(添加Web服务引用),用于添加Web Services引用
2.在Visual Studio 2008保留Add Web Reference(添加Web服务引用),是为了版本向前兼容。基于.NET Framework 2.0。
3.Visual Studio 2008在升级以后为了对.NET Framework 3.0 或 3.5版本上WCF Service Library的支持。增加了Add Service Reference(添加服务引用)功能。Framework3.0 或 3.5 时可用。
Add Web Reference(添加Web服务引用)和Add Service Reference(添加服务引用)联系和区别
联系:主要添加引用都有一个获取服务元数据,反序列话本地类文件的过程。这个结构也基本类似。都包含wsdldiscovery等文件。
区别:Add Web Reference 生成的 Reference.cs文件里,包含一个服务代理类,他负责与Web服务通信,它继承一个Soap类,使用SOAP协议,SOAP简单对象访问协议,基于XML语言。此外还包含一些Web服务类里定义的方法,和与之相关的异步调用方法和事件。遵守.NET Web Service 的主要规则。
Add Service Reference生成的客户端文件 Reference.cs。我看了一下,这个也会反序列化一个本地代理类,很相似和前者。不过除了服务类和其相关的一些别的类和契约接口。其中比较重要就是一个契约和一个通信管道。这个主要和WCF框架
的编程模型和反序列话机制有关系。因为WCF 强调的是 契约的概念,还有就是绑定协议,这个就直接决定了客户端和服务端通信的通道类型。你在这个文件里也能看到。此外还有服务请求和相应对应的信息。遵循WCF服务框架的规则。
下面是写的例子。可以查看Add Web Reference(添加Web服务引用)和Add Service Reference(添加服务引用)实现的区别:
1.创建一个Web Servcies程序
[WebService(Namespace = "http://127.0.0.1:8771/")] //为发布Webservices发布虚拟目录所在的域名 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 // [System.Web.Script.Services.ScriptService] public class Webserver01 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } /// <summary> /// 根据学生名称得到该学生的成绩 /// </summary> /// <param name="name"></param> /// <param name="intsecond"></param> /// <returns></returns> [WebMethod] public int GetGrades(string name, int intsecond) { if (intsecond > 0) { Thread.Sleep(intsecond * 1000); } int intGrade = 0; switch (name) { case "小白": intGrade = 90; break; case "小黑": intGrade = 70; break; case "小红": intGrade = 60; break; default: intGrade = 0; break; } return intGrade; } }
2 创建一个调用的控制台程序 Add Web Reference(添加Web服务引用),同步调用
class Program { static void Main(string[] args) { WebServer.Webserver01 webServer = new WebServer.Webserver01(); Console.WriteLine("请输入要查询成绩的学生的姓名:"); string strName = Console.ReadLine(); Console.WriteLine("请输入要延迟的秒数:"); int intSecond = int.Parse(Console.ReadLine()); Console.WriteLine("同步调用开始"); Console.WriteLine("同步调用结果为:" + webServer.GetGrades(strName, intSecond)); Console.WriteLine("同步调用结束"); Console.ReadLine(); } }
创建一个调用的控制台程序 Add Service Reference(添加服务引用),同步调用
class Program { static void Main(string[] args) { ServiceReference1.Webserver01SoapClient web = new ServiceReference1.Webserver01SoapClient(); Console.WriteLine("请输入要查询成绩的学生的姓名:"); string strName = Console.ReadLine(); Console.WriteLine("请输入要延迟的秒数:"); int intSecond = int.Parse(Console.ReadLine()); Console.WriteLine("同步调用开始"); Console.WriteLine("同步调用结果为:" + web.GetGrades(strName, intSecond));
Console.WriteLine("同步调用结束"); Console.ReadLine(); } }
同步调用的结果:
异步调用:Add Web Reference(添加Web服务引用),同步调用
/// <summary> /// 基于任务的异步操作 /// 异步调用客户端 /// </summary> class Program { static void Main(string[] args) { localhost.Webserver01 web = new localhost.Webserver01(); Console.WriteLine("请输入要查询成绩的学生姓名:"); string strName = Console.ReadLine(); Console.WriteLine("请输入要延迟的秒数:"); int intsecond = int.Parse(Console.ReadLine()); Console.WriteLine("异步调用开始"); web.GetGradesCompleted += new localhost.GetGradesCompletedEventHandler(service_Completed); web.GetGradesAsync(strName, intsecond);//开始异步调用 Console.WriteLine("当前进程没有被阻塞"); for (int i = 0; i < 3; i++) { Console.WriteLine(i); } Console.ReadLine(); } private static void service_Completed(object sender, localhost.GetGradesCompletedEventArgs e) { Console.WriteLine("异步调用的结果为:" + e.Result); Console.WriteLine("异步调用结束"); } }
异步调用的结果: