zoukankan      html  css  js  c++  java
  • WebService的使用

    Web Service三种核心技术标准
    1.服务提供者(服务端)
    2.服务请求者(客户端)
    3.服务注册中心(服务代理者)

    在构建和使用Web Service时,主要用到以下几个关键的技术和规则:
    1.XML:描述数据的标准方法
    2.SOAP:简单对象访问协议
    3.WSDL:Web服务描述语言
    4.UDDI(Universal Description, Discovery and Integration):通用描述、发现与集成,它是一种独立于
    平台的,基于XML语言的用于在互联网上描述商务的协议

    长项一:跨防火墙的通信
    长项二:应用程序集成
    长项三:B2B的集成
    长项四:软件和数据重用
    短处一:单机应用程序
    短处二:局域网的同构应用程序

    Web Service主要是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口
    Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、
    WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用
    注:SOAP协议(Simple Object Access Protocal,简单对象访问协议),它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议

    微软公司实际上在.NET里已经简化了创建和使用Web服务的过程。创建一个Web服务简单到只需创建.asmx文件,
    然后为Web服务的方法写一点代码,并添加<WebMethod()>宏,那些代码看上去就和本地组件代码一样。
    使用Web服务也是很简单,只需要添加Web服务的引用,就像普通应用程序编程一样,像组件那样调用。

    常见的返回数据方式:
    1.直接返回DataSet对象 (通常组件化的处理机制,不加任何修饰及处理)
    2.返回DataSet对象用Binary序列化后的字节数组 (字节数组流的处理模式,中文内容起到加密)
    3.返回DataSetSurrogate对象用Binary序列化后的字节数组 (微软提供的开源组件,加密)
    4.返回DataSetSurrogate对象用Binary序列化并Zip压缩后的字节数组 (对字节流数组进行压缩后传递)

    各种方式的使用:

    1.直接返回DataSet对象

      [WebMethod(Description = "直接返回DataSet对象")]  //Description 方法描述信息
      public DataSet getDataSet()
       {
          SqlConnection conn = new SqlConnection("Server=.;database=mytest;uid=sa;pwd=gao;");
          conn.Open();
          SqlDataAdapter sp = new SqlDataAdapter("select * from mydo", conn);
          DataSet ds = new DataSet();
          sp.Fill(ds);
          conn.Close();
          return ds;
       }

    调用:

         Dset.datasetSer s1 = new WF_Server.Dset.datasetSer();
         this.gvUser.DataSource = s1.getDataSet().Tables[0];

    2.返回DataSet对象用Binary序列化后的字节数组

     [WebMethod(Description = "返回DataSet对象用Binary序列化后的字节数组")]
      public byte[] getDataSetBytes()
       {
                DataSet ds = getDataSet();
                BinaryFormatter ser = new BinaryFormatter();     //实例化一个 Binary序列化
                MemoryStream ms = new MemoryStream();           //实例化一个 内存流
                ser.Serialize(ms, ds);                         //将ds数据序列化到内存流中
                byte[] buffer = ms.ToArray();                 //将内存流转换成byte字节数组
                return buffer;
       }

    调用:

        Dset.datasetSer s2 = new WF_Server.Dset.datasetSer();
        byte[] buffer = s2.getDataSetBytes();
        BinaryFormatter ser = new BinaryFormatter();
        DataSet dataset = ser.Deserialize(new MemoryStream(buffer)) as DataSet;
        bindDataSet(dataset);

    3.返回DataSetSurrogate对象用Binary序列化后的字节数组

       [WebMethod(Description = "返回DataSetSurrogate对象用Binary序列化后的字节数组")]
       public byte[] getDataSetSurrogateBytes()
        {
                DataSet ds = getDataSet();
                DataSetSurrogate dss = new DataSetSurrogate(ds);  //将ds用微软的程序进行实例化
                BinaryFormatter ser = new BinaryFormatter();     //实例化一个 Binary序列化
                MemoryStream ms = new MemoryStream();           //实例化一个 内存流
                ser.Serialize(ms, dss);                        //将ds数据序列化到内存流中
                byte[] buffer = ms.ToArray();                 //将内存流转换成byte字节数组
                return buffer;
    
        }

    4.返回DataSetSurrogate对象用Binary序列化并Zip压缩后的字节数组

    [WebMethod(Description = "返回DataSetSurrogate对象用Binary序列化并ZIP压缩后的字节数组")]
      public byte[] getDataSetSurrogateZipBytes()
      {
                DataSet ds = getDataSet();
                DataSetSurrogate dss = new DataSetSurrogate(ds);  //将ds用微软的程序进行实例化
                BinaryFormatter ser = new BinaryFormatter();     //实例化一个 Binary序列化
                MemoryStream ms = new MemoryStream();           //实例化一个 内存流
                ser.Serialize(ms, dss);                        //将ds数据序列化到内存流中
                byte[] buffer = ms.ToArray();                 //将内存流转换成byte字节数组
                byte[] Zipbuffer = Compress(buffer);         //将 buffer 传给一个方法进行压缩
                return buffer;
    
       }
       public byte[] Compress(byte[] data)
       {
                MemoryStream ms = new MemoryStream();  //定义一个内存流
                Stream zipStream = new GZipStream(ms, CompressionMode.Compress, true);
                                                       //用GZipStream对ms进行压缩,并转换为 Stream 类型
                zipStream.Write(data, 0, data.Length); //将输入的data写入到zipStream压缩流里
                zipStream.Close();                     //关闭zipStream压缩流
                ms.Position = 0;                       //设置内存流中的位置为0
                byte[] compressed_data = new byte[ms.Length];  //新建一个ms长度的字节数组
                ms.Read(compressed_data, 0, (int)ms.Length);   //将ms读入到 compressed_data 中
                return compressed_data;               //返回压缩后的字节数组
       }
    WebService同步、异步调用

    同步模式
    优点: 稳定、安全、可靠
    缺点: 效率低下

    异步模式(利用委托事件实现)
    优点: 高效、充分利用资源
    缺点: 事务处理较为复杂,不易于控制

    -------- WinFrom 异步调用

    每个公共的方法,都有一个后面加上 Asyn 的方法,该方法就是异步调用的
    在异步调用前,必需要注册一个 完成事件后的处理事件

     //发起异步调用(异步返回 HelloWorld)
       var ws = new ServiceReference1.WebServiceSoapClient();
    
     //注册 异步完成事件(ws_HelloWorldCompleted为事件名称)
       ws.HelloWorldCompleted += new   EventHandler<WindowsFormsApplication1.ServiceReference1.HelloWorldCompletedEventArgs>(ws_HelloWorldCompleted);
    
     //开始异步调用
       ws.HelloWorldAsync(new WindowsFormsApplication1.ServiceReference1.HelloWorldRequest());

    除了以上用增加完成事件处理异步外,还可以使用如下方法

       //利用 匿名委托完成上面的事情
         ws.HelloWorldCompleted += delegate(object x,ServiceReference1.HelloWorldCompletedEventArgs y)
         {
            MessageBox.Show(y.Result.Body.HelloWorldResult);
         };
     
       //利用 Lamba 表达式完成
        ws.HelloWorldCompleted += (x, y) => MessageBox.Show(y.Result.Body.HelloWorldResult);
     
        //利用 Lamba 表达式完成  当处理条件有多条时
        ws.HelloWorldCompleted += (x,y) =>{
        if (y.Error == null)
        {
               MessageBox.Show(y.Result.Body.HelloWorldResult);
        }
         else
        {
               MessageBox.Show(y.Error.Message);
        }
     };

    -------- Web站点 异步调用

    需要使用AJAX来进行异步调用,不能用上面的 完成事件 来实现,因为WEB是无状态的

    但AJAX异步调用是不能跨域的,用代理类可实现跨域

    在调用本域WebService之前必需将 WebService文件里的如下代码去掉注释,才能给AJAX进行调用

    [System.Web.Script.Services.ScriptService]

    下面是用 AJAX 调用本站的WebService,先须用微软的AJAX输入到WEB站点 

             <asp:ScriptManager ID="ScriptManager1" runat="server">
                <Services>
                <asp:ServiceReference Path="~/MyWebService.asmx" />  //本域的WebService文件
                </Services>
             </asp:ScriptManager>
            //利用单击事件触发该发法
            function Sum(){
                var a = document.getElementById("Text1").value;
                var b = $("#Text2").val();
                $("#D1").html("请求中,请稍后.....");
    
            //调用本域的WS进行赋值
                WebServiceCX.MyWebService.Add(a,b,function (result){
                    $("#D1").html(result);
                });
            }    


    注:WebServiceCX.MyWebService,这是当WS在引用命名空间下,当是直接站点时用 MyWebService即可
    利用 http://localhost:1456/MyWebService.asmx/jsdebug 可查看 是否注册WebService

    --------- 跨域异步调用

    用代理类可实现跨域,就是用 自己的 WS 调用别人的 WS ,然后自己再调用自己的 WS

    在本WS添加一个如下方法

         [WebMethod]
            public int Fex(int a, int b)
            {
            // 调用引用别人的WS
                return new ServiceReference1.WebServiceSoapClient().Fex(a, b);
            }

    然后再用AJAX调用这个方法

    function Fex(){
                var a = document.getElementById("Text1").value;
                var b = $("#Text2").val();
                $("#D1").html("跨站请求中,请稍后.....");
    
            //调用本域的WS进行赋值
                WebServiceCX.MyWebService.Fex(a,b,function (result){
                    $("#D1").html(result);
                });
            }

    --------- Web服务状态管理


    应用程序状态(Application)
    会话状态(Session)

    使用Session
    必需先在 [WebMethod] 改成 [WebMethod(EnableSession = true)] 启用 Session

    在 WEB服务里面 添加如下方法

    // 返回会话次数
    [WebMethod(EnableSession = true)]
    public int Count()
    {
        if (this.Session["c"] == null)
        {
        Session["c"] = 0;
        }
        int count = (int)Session["c"];
        count++;
        Session["c"] = count;
        return count;
    }

    在web站点调用该方法

    function See(){
        WebServiceCX.MyWebService.Count(function(e){
        $("#D1").html(e);
        });
    }

    每点击一次将Count加1,当浏览器关闭后,重新打开再次单击将修复成1

    如果当用户把Cookie禁用掉,Session将无法使用,因为 SessionID保存在Cookie里面
    解决方法:在Web.conf添加如下节点

    <configuration>
      <system.web>
        <sessionState cookieless="true"/>
      </system.web>
    </configuration>

    添加完后,客户端浏览器将会是如下格式
    http://localhost:1174/WebSite1/(S(dzfdkhnv2e2c1g45dkjuln55))/Default.aspx
    将SessionID保存在了URL中

  • 相关阅读:
    对cross-env的理解
    【好好学习】mh_h5
    QS工具入门
    vue中用qs传参发送axios请求
    Web API 异常处理
    WEB API Filter的使用以及执行顺序
    RSA/SHA1加密和数字签名算法在开放平台中的应用
    windows上RSA密钥生成和使用
    Cordova Error: cmd: Command failed with exit code ENOENT
    Cordova热更新cordova-hot-code-push
  • 原文地址:https://www.cnblogs.com/xgao/p/4174285.html
Copyright © 2011-2022 走看看