• webservice,webAPI,WCF调用方式


    1.webservice调用方式

    (1)前端调用webservice利用ajax;
    (2)后端调用则可以添加服务引用的方式:如公开的天气服务的webservice就可以通过添加服务引用的方式调用;
    (3)关于公安对接的说明:公司A中web应用程序系统通过ajax调用自己的webservice,然后webservice再调用公安的接口,这样实现了A应用程序中的数据同步到了公安(例如:酒店客人入住:酒馆系统如PMS 的页面中会触发ajax事件调用自己公司的webservice,webservice再调用公安的接口,这样就将客人入住信息传到了公安旅馆业系统。)说明:webService调用公安的接口,是通过使用了HttpWebRequest类(System.Net.HttpWebRequest)将请求发到了公安;
    

    使用HttpWebResponse 来获取响应内容;
    具体代码如下:

     public static bool CheckValidationResult(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors errors)
            {
                //总是接收
                return true;
            }
     public static string toPoliceApi(string url, string token, string postdata)
            {
    
                ShaEncryption shaencryption = new ShaEncryption();
                PoliceModel policemodel = new PoliceModel();
                RSAtoDoNet rsatodonet = new RSAtoDoNet();
    
                string result;
                string publickey = ConfigurationManager.AppSettings["publickey"];
                string privatekey = ConfigurationManager.AppSettings["privatekey"];
                string appid = ConfigurationManager.AppSettings["appid"];
                string appsecret = ConfigurationManager.AppSettings["appsecret"];
                string randomKey = Guid.NewGuid().ToString("N");
                string timeStamp = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString();
                string rawstr = "appid=" + appid + "&appsecret=" + appsecret + "&randomKey=" + randomKey + "&timeStamp=" + timeStamp;
                string signStr = shaencryption.Sha256Dncypt(rawstr);//先使用SHA256加密数据
                string bodystr = rsatodonet.RsaEncrypt(appsecret, publickey);//请求发送前将内容再用公钥加密
    
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                req.Headers.Add("appid", appid);
                req.Headers.Add("randomKey", randomKey);
                req.Headers.Add("timeStamp", timeStamp);
                req.Headers.Add("signStr", signStr);
    
                if (url != "https://100.16.7.12/dev/hotelindustry/public/index.php/api/Server/getToken")//获取Token令牌,
                {
                    req.Headers.Add("token",token);//将获取到的令牌加入消息到消息头中
                }
    
                req.Method = "POST";//指定请求类型是Post
                req.Timeout = 5000;//设置请求超时时间,单位为毫秒
                req.ContentType = "raw";
                byte[] data = Encoding.UTF8.GetBytes(postdata);
                req.ContentLength = data.Length;
                using (Stream  reqStream = req.GetRequestStream())
                {
                    reqStream.Write(data,0,data.Length);
                    reqStream.Close();            
                }
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream stream = resp.GetResponseStream();
                //获取响应内容
                using (StreamReader reader = new StreamReader(stream,Encoding.UTF8))
                {
                    result = reader.ReadToEnd();            
                }
                return rsatodonet.RsaDecrypt(result,privatekey);//接收请求后用私钥来解密
            }
          总结就是webservice再调用第三方api时,通过使用HttpWebRequest来实现。
    

    一、WebService
    WebService 是一个平台独立的、低耦合的、自包含的基于可编程的Web的应用程序,可使用开放的XML标准来描述,发布,发现,协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
    WebService技术能使得运行在不同机器上的不同应用无须借助附加的,专门的第三方软件或硬件就可相互交换数据或集成。依据WebService规范实施的应用之间,无论它们所使用的语言,平台或内部协议是什么,都可以相互交换数据。WebService是自描述,自包含的可用网络模块,可以执行具体的业务功能。WebService也很容易部署,因为它们基于一些常规的产业标准及已有的一些技术。诸如:XML,HTTP。WebService减少了应用接口的花费。

    2.webApi调用方式

    (1)前端调用:通过ajax
    type请求方式:Get:查 Post:新增 Put:改 Delete:删除
    (2)后端调用:

    Get操作

      使用HttpClient类(client.GetAsync()调用)(Syste.Net.Http.HttpClient),使用HttpResponseMessage response接收返回的结果。
      具体使用如下:
    
          public ActionResult Index()
          {
                //客户端对象的创建与初始化
                HttpClient client = new HttpClient();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));            
    
                //执行Get操作
                HttpResponseMessage response = client.GetAsync("http://localhost:16947/api/Products").Result;
                var list = response.Content.ReadAsync<List<Product>>().Result;
                ViewData.Model = list;
                return View();
          }
    
    Post操作
      使用HttpClient类(client.PostAsync()调用)
      具体代码如下:
    
           public static readonly HttpClient httpClient = new HttpClient();
            /// <summary>
            /// 发送信息到消息Api
            /// </summary>
            /// <returns>返回执行的状态码</returns>
            private string Post(string url, PushHotelData pushdata)
            {
                string content = JsonConvert.SerializeObject(pushdata);
                HttpContent httpContent = new StringContent(content, Encoding.UTF8);
                httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
                var task = httpClient.PostAsync(url, httpContent);//发送请求
                var statusCode = task.Result.StatusCode;
                return statusCode != HttpStatusCode.OK ? task.Result.Content.ReadAsStringAsync().Result : $"StatusCode:{statusCode}";
            }
    
        public class PushHotelData
        {
            /// <summary>
            /// 商店编号
            /// </summary>
            public string HotelCode { get; set; }
            /// <summary>
            /// 序列化之后的message数据
            /// </summary>
            //public string PushMessage { get; set; }
    
            public PushHotelDataMessageDetail Message { get; set; }
    
          }
         
        public class PushHotelDataMessageDetail
        {
            public string  messagetype { get; set; }
    
            public string messageContent { get; set; }
        }
    

    3.WCF调用

    通过添加服务引用的方式调用。

     WCF(Windows Communication Foundation): 是由微软开发的一系列支持数据通信的应用程序框架,可翻译为Windows通信开发平台。
     WCF整合了原有的Windows通信的.net Remoting,WebService,Socket机制,并融合有HTTP和FTP的相关技术。WCF是对这些技术的统一。
     WCF为.Net Framework提供了一个基础,使其能够编写代码,以在组件,应用程序,系统之间进行通信,WCF设计遵循的是面向服务原则。服务是指可以通过消息与之进行交互的一段代码。服务是被动的,它们等待传入消息之后才开始工作。客户端是发起者,客户端将消息发送给服务来请求工作。
        WCF是Windows平台上开发分布式应用最佳的实践方式。
    
     WCF体系架构简介:
    ![](https://img2020.cnblogs.com/blog/925682/202004/925682-20200423233849327-1899230221.png)
    1.	契约(协定)
       契约定义消息系统的各个方面。
       * 数据契约:服务中的参数
       * 消息契约:使用SOAP协议特定的消息部分。
       * 服务契约:服务中的方法
       * 策略与绑定:策略设置安全或其他条件,绑定指定传输方式与编码;
    2.	服务运行
      服务运行期间的行为控制。
      * 限制行为:控制处理的消息数;
      * 错误行为:出现内部错误时所处理的操作;
      * 元数据行为:是否向外提供元数据及元数据的提供方式;
      * 实例行为:可运行的服务实例数目;
      * 事物行为:处理事务;
      * 调度行为:控制WCF处理消息的方式;
    3.	消息传递
    消息传递层说明数据的交换格式和传输模式。消息传递层由通道(信道)组成,通道是对消息进行处理的组件,负责以一致的方式对消息进行整理和传送。通道用于传输层,协议层及消息获取。各层次的通道组成了信道栈。
    通道对消息和消息头进行操作,服务运行时对消息正文进行操作。通道包括两种类型:传输通道和协议通道。
    * 传输通道:读取和写入来自网络的消息,传输通道通过编码器将消息转换为网路传输使用的字节流及将字节流转换为消息。传输通道包括HTTP通道,命名管道,TCP,MSMQ等。
    * 协议通道: 通过读取和写入消息头的方式来实现消息协议,如:WS-Security,WS-Reliability.
    4.	宿主和激活
       服务宿主负责WCF服务的生命周期和上下文的操作系统进程,负责启动和停止WCF服务,并提供控制服务的基本管理功能。  
         ![](https://img2020.cnblogs.com/blog/925682/202004/925682-20200423233826186-2049568659.png)
      WCF 和WebService区别:
    1. WebService: 严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据。
    (这个是跨语言和平台的关键)。微软的Web服务实现称为ASP.NET WebService,使用Soap简单对象访问协议来实现分布式环境里应用程序之间的数据交换。
    WSDL实现服务接口相关的描述。此外,WebService可以注册到UDDI中心,供其客户查找使用。后来微软做了ASP.NET WebService的安全,性能,数据加密,解密,托管宿主等多方面的扩展,称为WSE系列。这个是过度产品,最高到WSE3.0。后来就是WCF时代。
    2. WCF: 其实一定程度上就是ASP.NET WebService,因为它支持WebService的行业标准和核心协议,因此Asp.NET WebService和WSE能做的事情它几乎都能胜任,跨平台和语言更不是问题(数据也支持XML格式化,而且提供了自己的格式化器)。               
    

    WCF 体系架构简介

    WCF框架组成:契约(协定),服务运行,消息传递,宿主和激活;

    WCF基本概念:契约,地址,终结点,绑定Binding,宿主;

  • 相关阅读:
    20155217 实验四 Android程序设计
    20155217 第十二周课堂测试
    20155217 《Java程序设计》第三次实验报告
    20155217 2016-2017-2 《Java程序设计》第10周学习总结
    20155217 实验二 Java面向对象程序设计 实验报告
    20155217 2016-2017-2 《Java程序设计》第9周学习总结
    20155217 2016-2017-2 《Java程序设计》第8周学习总结
    实验一 Java开发环境的熟悉(Linux+Eclipse)
    Spring阶段性学习总结(一)实现一个简单的HellowWorld
    MySql数据库再学习——使用强化版的自定义连接池连接数据库
  • 原文地址:https://www.cnblogs.com/newcapecjmc/p/12758863.html
Copyright © 2020-2023  润新知