zoukankan      html  css  js  c++  java
  • WebService

    基础知识

          发展进程: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("异步调用结束");
            }
    
    
    
        }
    

      

     异步调用的结果:

  • 相关阅读:
    GetDlgItem
    vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess
    C #中的几个线程同步对象方法 zz
    vc中调用exe的方法
    函数PlaySound和sndPlaySound的用法
    Radio Button的使用
    用Event实现线程同步
    C++学习随笔之九:类和动态内存分配
    C++学习随笔之七:对象和类
    C++学习随笔之二:数据处理
  • 原文地址:https://www.cnblogs.com/shikangjie/p/5678843.html
Copyright © 2011-2022 走看看