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中

时间: 2024-12-25 12:07:04

WebService的使用的相关文章

自定义及发布一个webservice服务

自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       Endpoint.publish()发布 (默认对public修饰的方法进行发布)    - 通过wsimport生成本地代理来访问自己发布的webservice       wsimport 1.发布自定义webservice phone.java package ws.myWebService

调用已发布的WebService

WebService服务演示 登录http://www.webxml.com.cn 单击手机查询服务 3.         选择要调用的方法 例如: getMobileCodeInfo. 4. 输入要查询的手机号单击”调用” 截图如下, 免费用户 UserID为null a)   可以看到返回如下结果: <?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://WebXml

webservice实验一

实验目的:安装jdk1.6_21以后的版本,利用JAX-WS API自己发布webservice并调用,以及用wsimport生成webservice客户端代码调用一个免费的web服务(如webxml.com.cn上的获取手机归属地的服务). 一.webservice原理了解 webservice是一种通用的跨语言跨平台的数据交互方式,之所以能够做到这一点,是因为它的底层实现机制是依赖于HTTP协议以及XML格式这些开发的标准.webservice使用SOAP(simple object acc

C# 动态生成WebService,无需添加引用

C#项目调用WebService是很常见的现象,但一旦修改链接地址就需要重新更新引用很是麻烦,这里跟大家分享一个通过地址,无需添加引用动态生成Webservice的小方法 方法类: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.ServiceModel; 6 using System.ServiceModel.Channels

一个简单的WebService服务

现在,网上提供的免费的webservice服务的网站: http://www.webxml.com.cn/ 从扩展名上看,是 .net构建的网站. 看看功能的实现效果: 需求:我们要远程调用手机号归属地的查询: 开发步骤: 1.建立工程:ws01_firstws 2.用jdk自带的工具读取wsdl地址 新建 结果输出: 根据远程的服务生成的这些内容称之为stub-桩,将生成的桩复制到项目的目录中去: 下一步:要编写客户端调用. public class FirstClient { public

Java调用WebService 接口 实例

这里给大家介绍一下,Java调用webservice的一个实例的过程. 本项目不能运行,因为接口地址不可用. 这里只是给大家介绍一个过程,同时留作自己的笔记.如果要学习,可以参照别人的实例.比较好. ①选择项目根目录的src ,右键,new --> webservice client 然后输入地址: http://172.18.100.52:456/hello?wsdl 必须要加wsdl结尾,这样才是一个webservice的接口. finlish.这时候刷新项目.可以看到项目下/src/com

WebService -- Java 实现之 CXF (初体验)

1. 认识WebService 简而言之,她就是:一种跨编程语言以及操作系统的远程调用技术. 大家都可以根据定义好的规范和接口进行开发,尽管各自的使用的开发语言和操作系统有所不同,但是由于都遵循统一的规范还有接口,因而可以做到透明和正常交互. 2. CXF 官方主页:http://cxf.apache.org/ 定义: Apache CXF is an open source services framework. CXF helps you build and develop services

.net实现webservice简单实例分享

原理:WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互.作用:主要用于数据交换.提供服务接口优点:可跨平台.部署简单调用方便.无需额外客户端支持 一.创建一个WebService服务1.创建一个普通的Asp.Net Web应用程序,名称为WebServiceDemo 2.在刚创建的web程序里添加一个WebService服务文件,名称为TestService.asm

CXF框架实现webservice实例

服务器端: 1.新建Web项目,例如CXF_Server,导入cxf-2.4.2的相关jar包,如下图所示: 2.新建一个webservice服务接口MyService,该接口通过注解来暴露服务:  package com.founder.service; import javax.jws.WebService; @WebService(serviceName="MyServiceManage") public interface MyService { /**  * add():定义

C/C++利用gsoap库调用WebService

C/C++调用WebService需要用到soap库,一般使用的有gsoap和axis cpp两种实现,这里使用gsoap来调用.gsoap可以在 linxu.windows.mac多种平台上使用. gsoap的主页地址是http://gsoap2.sourceforge.net/ 新建一个WebService: 1 //写一个简单的方法 2 [WebMethod(Description="返回字符串")] 3 public string HelloWorld(string str)