浅谈WebService开发(一)转

一、什么是WebService:

简单通俗来说,就是企业之间、网站之间通过Internet来访问并使用在线服务,一些数据,由于安全性问题,不能提供数据库给其他单位使用,这时候可以使   用WebService服务提供。

二、创建WebService

创建WebService之后,我们就可以在文件里写返回数据的方法了。

三、返回数据的四种形式

笔者水平有限,只列出这四种数据的返回形式:

(1)直接返回DataSet对象
  (2)返回DataSet对象用Binary序列化后的字节数组
  (3)返回DataSetSurrogate对象用Binary序列化后的 字节数组
  (4)返回DataSetSurrogate对象用Binary序列化并Zip 压缩后的字节数组

理论上来说,网络传输字节与传输时间,应该是递减的,其中,(3)(4)种方法需要引用微软提供的开源组件  下载地址:http://support.microsoft.com/kb/829740/zh-cn

下面展示这四种返回数据的代码,其中(1)是其三种方法的根本,都要得到一个DataSet作为根本,然后来做各种转换压缩的操作:

[WebMethod(Description = "直接返回DataSet对象")]
    public DataSet GetDataSet()
    {
        string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ToString();
        SqlConnection conn = new SqlConnection(connStr);
        string sql = "select * from china_city";
        conn.Open();
        SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
        DataSet ds = new DataSet("China");
        sda.Fill(ds);
        conn.Close();
        return ds;
    }  

    [WebMethod(Description = "直接返回DataSet对象,并用Binary序列化后的字节数组")]
    public byte[] GetDataSetBytes()
    {
        DataSet ds = GetDataSet();
        BinaryFormatter ser = new BinaryFormatter();  //序列化对象
        MemoryStream ms = new MemoryStream();  //内存流
        ser.Serialize(ms, ds);
        byte[] buffer = ms.ToArray();    //字节流
        return buffer;
    }  

    [WebMethod(Description = "直接返回DataSetSurrogate对象,并用Binary序列化后的字节数组")]
    public byte[] GetDataSetSurrogateBytes()
    {
        DataSet ds = GetDataSet();
        DataSetSurrogate dss = new DataSetSurrogate(ds);
        BinaryFormatter ser = new BinaryFormatter();  //序列化对象
        MemoryStream ms = new MemoryStream();  //内存流
        ser.Serialize(ms, dss);
        byte[] buffer = ms.ToArray();    //字节流
        return buffer;  

    }  

    [WebMethod(Description = "直接返回DataSetSurrogate对象,并用Binary序列化后并且ZIP压缩的字节数组")]
    public byte[] GetDataSetSurrogateZipBytes()
    {
        DataSet ds = GetDataSet();
        DataSetSurrogate dss = new DataSetSurrogate(ds);
        BinaryFormatter ser = new BinaryFormatter();  //序列化对象
        MemoryStream ms = new MemoryStream();  //内存流
        ser.Serialize(ms, dss);
        byte[] buffer = ms.ToArray();    //字节流
        byte[] bufferZip = ComPress(buffer);
        return buffer;
    }
    //压缩方法
    public byte[] ComPress(byte[] data)
    {
        try
        {
            MemoryStream ms = new MemoryStream();
            Stream zipStream = null;
            zipStream = new GZipStream(ms, CompressionMode.Compress, true);
            zipStream.Write(data, 0, data.Length);
            zipStream.Close();
            ms.Position = 0;
            byte[] compressed_data = new byte[ms.Length];
            ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString()));
            return compressed_data;
        }
        catch
        {
            return null;
        }
    }

我们可以在浏览器中查看下WebService的效果,如图,在这个页面中,有提供四个方法,这四个方法就是上述我们写的四个返回数据的方法了,点击方法即可返回相应的数据,这样,我们数据提供方的代码就可以写好了,接下来,我们写调用数据的方法!

四、调用数据

客户端WebService程序

private void button1_Click(object sender, EventArgs e)
    {
        com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();  //new出WebService对象
        DateTime dtBegin = DateTime.Now;
        DataSet dataSet = ds.GetNorthwindDataSet();
        this.label1.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin);
        binddata(dataSet);
    }
    private void button2_Click(object sender, EventArgs e)
    {
        com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();
        DateTime dtBegin = DateTime.Now;
        byte[] buffer = ds.GetDataSetBytes();
        BinaryFormatter ser = new BinaryFormatter();
        DataSet dataSet = ser.Deserialize(new MemoryStream(buffer)) as DataSet;
        this.label2.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin) + "  " + buffer.Length;
        binddata(dataSet);
    }
    private void button3_Click(object sender, EventArgs e)
    {
        com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();
        DateTime dtBegin = DateTime.Now;
        byte[] buffer = ds.GetDataSetSurrogateBytes();
        BinaryFormatter ser = new BinaryFormatter();
        DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
        DataSet dataSet = dss.ConvertToDataSet();
        this.label3.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin) + "  " + buffer.Length;
        binddata(dataSet);
    }
    private void button4_Click(object sender, EventArgs e)
    {
        com.dzbsoft.www.Service1 ds = new com.dzbsoft.www.Service1();
        DateTime dtBegin = DateTime.Now;
        byte[] zipBuffer = ds.GetDataSetSurrogateZipBytes();
        byte[] buffer = UnZipClass.Decompress(zipBuffer);
        BinaryFormatter ser = new BinaryFormatter();
        DataSetSurrogate dss = ser.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
        DataSet dataSet = dss.ConvertToDataSet();
        this.label4.Text = string.Format("耗时:{0}", DateTime.Now - dtBegin) + "  " + zipBuffer.Length;
        binddata(dataSet);
    }
    private void binddata(DataSet dataSet)
    {
        this.dataGridView1.DataSource = dataSet.Tables[0];
        this.label5.Text = "共计:" + dataSet.Tables[0].Rows.Count + "条记录";
    }

在数据返回的方法中,我们使用了数据的压缩,所以,在调用方这边,需要进行解压,代码:

客户端UnZipClass程序
    public static class UnZipClass
    {
        public static byte[] Decompress(byte[] data)
        {
            try
            {
                MemoryStream ms = new MemoryStream(data);
                Stream zipStream = null;
                zipStream = new GZipStream(ms, CompressionMode.Decompress);
                byte[] dc_data = null;
                dc_data = ExtractBytesFromStream(zipStream, data.Length);
                return dc_data;
            }
            catch
            {
                return null;
            }
        }
        public static byte[] ExtractBytesFromStream(Stream zipStream, int dataBlock)
        {
            byte[] data = null;
            int totalBytesRead = 0;
            try
            {
                while (true)
                {
                    Array.Resize(ref data, totalBytesRead + dataBlock + 1);
                    int bytesRead = zipStream.Read(data, totalBytesRead, dataBlock);
                    if (bytesRead == 0)
                    {
                        break;
                    }
                    totalBytesRead += bytesRead;
                }
                Array.Resize(ref data, totalBytesRead);
                return data;
            }
            catch
            {
                return null;
            }
        }
    }

在上例中,调用四个方法的效果是一样的,唯一不同的是,传输过程中,数据量大小和传输时间的差异。

声明:此博客为DotNetGeek.cn的Copy ,原文链接 http://www.dotnetgeek.cn/xuexiwebservice1.html

时间: 2024-10-08 22:45:42

浅谈WebService开发(一)转的相关文章

浅谈游戏开发中碰撞检测

原创整理不易,转载请注明出处:使用Memcached.Spring AOP构建数据库前端缓存框架 代码下载地址:http://www.zuidaima.com/share/1781569917635584.htm 数 据库访问可能是很多网站的瓶颈.动不动就连接池耗尽.内存溢出等.前面已经讲到如果我们的网站是一个分布式的大型站点,那么使用memcached实现数 据库的前端缓存是个很不错的选择:但如果网站本身足够小只有一个服务器,甚至是vps的那种,不推荐使用memcached,使用Hiberna

浅谈WebService SOAP、Restful、HTTP(post/get)请求

HTTP-GET 和 HTTP-POST HTTP-GET和HTTP-POST是标准协议,他们使用HTTP(超文本传输协议)谓词(谓词是指条件表达式的求值返回真或假的过程.)对参数进行编码并将参数作为名称/值对传递,还使用关联的请求语义.每个协议都包含一系列HTTP请求标头,HTTP请求标头及其他一些信息定义客户端向服务器请求哪些内容,哪个服务器用一系列HTTP响应标头和所请求的数据进行响应. HTTP-GET 使用 MIME 类型 application/x-www-form-urlencod

浅谈webform开发时前台请求后台数据的方法

说到前台请求后台数据,我们一般都是用到AJAX(异步JavaScript和XML) .AJAX 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,我们可以对网页的某部分进行更新.在这里,主要浅谈一下在.net的webform开发时,前台请求后台的两种方式. 1.使用AjaxPro2.dll  (1)AjaxPro2.dll文件可以去网上下载,下载后引用到项目中. (2)引用到项目之后,在web.config里面的<system.web

浅谈混合开发与Android,JS数据交互

本文是作者原创,如转载请注明出处! 一.概论 现在时代已经走过了移动互联网的超级火爆阶段,市场上移动开发人员已经趋于饱和,显然,只会原生APP的开发已不能满足市场的需求,随着H5的兴起与火爆,H5在原生APP中的使用越来越广泛,也就是我们常说的混合开发(Hybrid APP).最新很火的微信小程序相信大家都是知道的,实际上微信小程序加载的界面就是一个HTML5的界面,HTML5界面在一些电商类的APP中主要承担展示数据的作用,但是他的作用并不仅限于此,最起码js调用原生方法和原生调用js的方法是

浅谈前端开发行业背景

自从第一个网站在上个世纪 90 年代初诞生以来,早期的网页完全由文本构成,除了一些小图片和毫无布局可言的标题与段落.然而,时代在进步,接下来出现了表格布局,然后是 Flash,最后是基于 CSS 的网页设计.无可否认,前端页面重构技术也经历着这样的一个过程:table布局页面→DIV+CSS→HTML5+CSS3,seo面对众多的浏览器与平台,Web前端不再是以前那样简单的重复性工作.下面让我们对Web前端开发行业的发展有一个简短的认识. 回首Web前端开发的过去,1991 年 8 月,Tim

浅谈移动开发(一)趋势

移动开发这几年的发展异常迅猛,在这个智能手机普及得像人体器官的时代,游戏.电商移动平台和社交软件给人们生活带来的的巨变.随着移动互联网向各行各业的渗透,企业级的应用也开始发力,专家们预测现阶段已经进入企业级移动应用爆发的时代,各企业级应用平台厂商和IT服务企业对移动开发人才的争夺也日趋激烈. 企业级应用和通用型应用的开发差异并不大,差别在于用户群体的不同,企业级应用就单个应用而言不可能具备几百万级的用户群,因为企业级应用的特殊性其所能带来的价值是相对固定.为了最大的利润,在产出值增长空间不大的前

浅谈Android开发中Shape的使用

引言 在Android开发中我们很多情况都是使用图片来展示相关效果,今天我就来详细介绍下Android下使用Shape来进行简单UI的开发.一方面这些是Android开发的基础,另一方面这方面的知识可以在一定程度上减少图片的使用,降低App的体积.下面我就来详细介绍Shape的相关知识. 注意点:一般用shape定义的xml文件存放在drawable目录下,若项目没有该目录则新建一个,而不要将它放到drawable-hdpi等目录中. Shape支持的类型形状    rectangle: 矩形,

浅谈软件开发项目如何实现精益生产

精益生产(LeanProduction),简称"精益",是衍生自丰田生产方式的一种管理哲学.精益生产是通过系统结构.人员组织.运行方式和市场供求等方面的变革,使生产系统能很快适应用户需求不断变化,并能使生产过程中一切无用.多余的东西被精简,最终达到包括市场供销在内的生产的各方面最好结果的一种生产管理方式,它的核心是消除浪费,显然软件开发行业也需要这种理念. 不管开发什么产品,都需要首先考虑质量问题.一些软件企业为了降低成本而忽视质量,但质量低下的软件会造成返工的浪费,反而提高成本.相反

浅谈WebService的调用&lt;转&gt;

0.前言 前段时间,公司和电信有个合作,产品对接电信的某个平台,使用了WebService接口的调用,实现了业务受理以及单点登录.终于使用到了WebService,楼主还是比较兴奋的,目前功能已经上线,下面进行使用总结.WebService涉及到内容还是比较多的,涉及到发布和调用,有不少知识点,本文只是最简单的调用. 1.WebService简介 WebService是基于soap协议(简单对象访问协议全写为Simple Object Access Protocol)的,所有的webServic