常用WebServices返回数据的4种方法比较

以前经常在群里听到朋友们说WebServices的性能特别的慢,说的如何如何。说实话,WebServices的确比调用本地数据要慢一些,可是究竟有多慢,真的如朋友们说的那么难以忍受吗?我个人感觉,多半原因在处理的方式上。让我们亲自编写测试代码,来证明这一切吧。文章由于是我一段时间的总结篇,因此难免参杂个人主观因素,说的不对的地方,还请多多批评。以下我们主要从调用WebServices的方法的特点、应用场景、测试结果三个方面来进行下说明分析。

1. 直接返回DataSet对象

    特点:直接返回DataSet对象。

    应用场景:1.内网。2.外网且数据量在kb级别时。

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

    特点:字节数组流的处理模式。

    应用场景:较大数据交换。

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

    特点:使用微软提供的开源组件进行序列化,依然是字节流的处理模式。详情请参考:http://support.microsoft.com/kb/829740/zh-cn

    应用场景: 较大数据交换。

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

     特点:使用微软提供的开源组件对字节流数组进行压缩后传递,依然是字节流的处理模式。详情请参考:http://support.microsoft.com/kb/829740/zh-cn

     应用场景:外网环境需要进行大数据量网络数据传递时,建议采用此种方法。也是笔者强烈向大家推荐使用的一种方法。

WebServices的代码如下:

ContractedBlock.gifExpandedBlockStart.gifWebServices
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;


using System.Data;
using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
namespace WebService1
{
    
/// <summary>
    
/// Service1 的摘要说明
    
/// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(
false)]
    
public class Service1 : System.Web.Services.WebService
    {
        [WebMethod(Description
="直接返回DataSet对象")]
        
public DataSet GetDataSet()
        {
            
string sql = "select * from Customers";
            Database db 
= DatabaseFactory.CreateDatabase();
            DataSet ds 
= db.ExecuteDataSet(CommandType.Text,sql);
            
return ds;
        }

        [WebMethod(Description 
= "返回DataSet对象用Binary序列化后的字节数组")]
        
public byte[] GetBytes()
        {
            DataSet ds 
= GetDataSet();
            BinaryFormatter bf 
= new BinaryFormatter();
            MemoryStream ms 
= new MemoryStream();
            bf.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 bf 
= new BinaryFormatter();
            MemoryStream ms 
= new MemoryStream();
            bf.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 bf 
= new BinaryFormatter();
            MemoryStream ms 
= new MemoryStream();
            bf.Serialize(ms, dss);
            
byte[] buffer = ms.ToArray();
            
byte[] Zipbuffer = Compress(buffer);
            
return Zipbuffer;
        }

        
//压缩压缩后的字节数组
        public byte[] Compress(byte[] data)
        {
            MemoryStream ms 
= new MemoryStream();
            Stream zipStream 
= new GZipStream(ms, CompressionMode.Compress, true);
            zipStream.Write(data, 
0, data.Length);
            zipStream.Close();
            ms.Position 
= 0;
            
byte[] buffer = new byte[ms.Length];
            ms.Read(buffer, 
0,int.Parse(ms.Length.ToString()));
            
return buffer;
        }
    }
}

 

客户端调用WebServices的代码如下:

ContractedBlock.gifExpandedBlockStart.gif客户端调用WebServices
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebServicesClient.localhost;
using System.Data;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Diagnostics;
namespace WebServicesClient
{
    
public partial class _Default : System.Web.UI.Page
    {
        Service1 s 
= new Service1();
        
protected void Page_Load(object sender, EventArgs e)
        {

        }

        
//直接返回DataSet对象
        protected void Button1_Click(object sender, EventArgs e)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            DataSet ds 
= s.GetDataSet();
            GridView1.DataSource 
= ds.Tables[0].DefaultView;
            GridView1.DataBind();
            sw.Stop();
            Label1.Text 
= string.Format("耗时:{0}毫秒", sw.ElapsedMilliseconds.ToString());
        }

        
//得到DataSet对象用Binary序列化后的字节数组
        protected void Button2_Click(object sender, EventArgs e)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            
byte[] buffer = s.GetBytes();
            BinaryFormatter bf 
= new BinaryFormatter();
            DataSet ds 
= bf.Deserialize(new MemoryStream(buffer)) as DataSet;
            GridView1.DataSource 
= ds.Tables[0].DefaultView;
            GridView1.DataBind();
            sw.Stop();
            Label2.Text 
= string.Format("耗时:{1}毫秒;数据大小:{0}", buffer.Length.ToString(), sw.ElapsedMilliseconds.ToString());
        }
        
//得到DataSetSurrogate对象用Binary序列化后的字节数组
        protected void Button3_Click(object sender, EventArgs e)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            
byte[] buffer = s.GetDataSetSurrogateBytes();
            BinaryFormatter bf 
= new BinaryFormatter();
            DataSetSurrogate dss 
= bf.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
            DataSet ds 
= dss.ConvertToDataSet();
            GridView1.DataSource 
= ds.Tables[0].DefaultView;
            GridView1.DataBind();
            sw.Stop();
            Label3.Text 
= string.Format("耗时:{1}毫秒;数据大小:{0}", buffer.Length.ToString(), sw.ElapsedMilliseconds.ToString());
        }
        
//得到DataSetSurrogate对象用Binary序列化并ZIP压缩后的字节数组
        protected void Button4_Click(object sender, EventArgs e)
        {
            Stopwatch sw 
= new Stopwatch();
            sw.Start();
            
byte[] zipBuffer = s.GetDataSetSurrogateZipBytes();
            
byte[] buffer = UnZip.Decompress(zipBuffer);
            BinaryFormatter bf 
= new BinaryFormatter();
            DataSetSurrogate dss 
= bf.Deserialize(new MemoryStream(buffer)) as DataSetSurrogate;
            DataSet ds 
= dss.ConvertToDataSet();
            GridView1.DataSource 
= ds.Tables[0].DefaultView;
            GridView1.DataBind();
            sw.Stop();

            Label4.Text 
= string.Format("耗时:{1}毫秒;数据大小:{0}",zipBuffer.Length.ToString(),sw.ElapsedMilliseconds.ToString());
        }
    }
}

 

测试的结果按照先后顺序如下图所示:


关于测试结果的特殊说明:由于测试环境是在本地,数据量也不是很大,测试的结果离实际情况还不是很接近,如果大家有条件的话,可以测试一下,同时希望把测试的结果提供给大家参考。

最后,为了方便大家,这里还提供了源码下载,下载地址如下:

/Files/wlb/WebServiceSummary.rar 

关于源代码的特殊说明:笔者这里的开发环境为VS2008中文版sp1+SQLServer2008sp1。数据库为Northwind数据库。

转载于:https://www.cnblogs.com/aaa6818162/archive/2009/08/07/1541058.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】vscode下编译告警“undefined reference”?三步教你如何解决

转自&#xff1a;vscode下编译告警“undefined reference”&#xff1f;三步教你如何解决_squall0984的博客-CSDN博客 近些年来&#xff0c;由于VS Studio体积庞大、价格昂贵等原因&#xff0c;越来越多的C/C开发者转投VSCode的怀抱。VSCode有着免费1、开源2、多平台支持、占…

【转】vscode配置C/C++环境

转自&#xff1a;vscode配置C/C环境 - 知乎 VS Code配置作者&#xff1a;谭九鼎 链接&#xff1a;Visual Studio Code 如何编写运行 C、C 程序&#xff1f; - 知乎 有改动。个人按照步骤后&#xff0c;做到复制上三个json那一步&#xff0c;就可以运行了。 我将settings.json…

【转】dicom网络通讯入门(1)

转自&#xff1a;dicom网络通讯入门&#xff08;1&#xff09; - assassinx - 博客园 如果只看标准就会越看越糊涂&#xff0c;根本原因就是因为dicom抽象得太严重&#xff0c;是“专家”弄的。没办法。 那么到底服务类是什么&#xff1f;sop 又是什么&#xff1f;&#xff0…

用WebORB实现flex + .net后台的Remoting

实现flex与后台通信最简单的方式是采用httpServic的方式&#xff0c;或webservice。但这两种方式都是基于文本的传输&#xff0c;传输效率低&#xff0c;采用RemoteObject的方式&#xff0c;传输的内容采用AMF3格式的二进制编码&#xff0c;效率较高&#xff0c;并且能实现远程…

【转】dicom网络通讯入门(2)

转自&#xff1a;dicom网络通讯入门&#xff08;2&#xff09; - assassinx - 博客园 首先我们现一个echo响应测试工具&#xff0c;也就是echo 的scu&#xff0c;不是实现打印作业管理么。同学我告诉你还早着呢。本来标题取的就是《dicomviewer 第二弹 之 实现打印管理》名字多…

基于WINCE6.0下载multiple XIP镜像文件

备注&#xff1a;基于usb下载的方式&#xff0c;MLC nand flash为K9G8G08U 1. Multiple XIP模式的文件说明 Multiple XIP模式下生成的文件有chain.bin、chain.lst、NK.bin、xip.bin和xipkernel.bin&#xff0c;如下图所示&#xff1a; 图1 2. Eboot下载Multiple XI…

Final Michael Scofield

转载于:https://www.cnblogs.com/andrewx/archive/2009/08/16/1547738.html

【转】dicom网络通讯入门(3)

转自&#xff1a; dicom网络通讯入门&#xff08;3&#xff09; - assassinx - 博客园 接下来可以进行消息传递了 &#xff0c;也就是dimse &#xff0c;再来复习下 什么是dimse 。n-set n-create c-echo 这些都是dimse 他们都是属于一种结构的pdu 那就是tf-pdu&#xff08;传…

【转】ubuntu 下 VNCview 远程桌面无法传输文件问题

转自&#xff1a;ubuntu18.04VNCview文件传输问题_gsls200808的专栏-CSDN博客_vnc传输文件按钮不可用 很多文章说VNCview不能传输文件&#xff0c;实际上这是一个误区。 以ubuntu为例&#xff0c;默认使用 sudo apt-get vnc4server 这个命令安装上的vncserver实际是tigerVNC…

在何时该用什么方式编译WinCE

这是一篇很好的文章&#xff0c;很多开发者其实并没有搞清楚这个问题&#xff1a;在何时该用什么方式编译WinCE 导致走了很多弯路&#xff0c;也包括我自己 感谢作者写了这篇文章 这么好的文章&#xff0c;我想应该翻译过来给大家 在何时该用什么方式编译WinCE 在新闻组里&…

【转】Ubuntu 16.04 安装 CUDA10.1 (解决循环登陆的问题)

转自&#xff1a;Ubuntu 16.04 安装 CUDA10.1 &#xff08;解决循环登陆的问题&#xff09; - Hongkai_Ding - 博客园 0. 前言 这里直接用 cuda安装文件同时安装 NVIDIA 驱动和 CUDA&#xff0c;没有单独安装更高版本的 NVIDIA 驱动&#xff1b;此安装是在 Intel 集显下的图形…

【转】Ubuntu 16.04 Nvidia驱动安装(run方式)

转自&#xff1a;Ubuntu 16.04 Nvidia驱动安装(run方式)_lihe的博客-CSDN博客 1.下载驱动程序 Nvidia驱动下载 https://www.geforce.cn/drivers/beta-legacy http://www.nvidia.cn/Download/index.aspx 根据显卡选择适用的驱动版本&#xff0c;下载完之后是一个名称为 NVIDIA…

2008R2Win7管理九DNS冗余和恢复

2008R2Win7管理九DNS冗余和恢复 本文介绍如何在ad中的主dns崩溃后快速利用备份dns将主dns恢复.以及在主dns完好的时候进行dns冗余备份 本文在file这台服务器上安装好dns角色来作为主dns的备份,安装角色的过程不在详细描述,略过.相信大家都知道了. 本问对拓扑图略有改动,故再次更…

【转】DICOM通讯(ACSE->DIMSE->Worklist)

转自&#xff1a;DICOM通讯&#xff08;ACSE-&#xff1e;DIMSE-&#xff1e;Worklist&#xff09; - 知乎 1 DICOM通讯概要介绍 DICOM通讯和TCP IP的设计原理别无二致。从用户数据到网络上传输数据的过程中&#xff0c;要经历多层协议处理&#xff0c;每经一层&#xff0c;就…

[Silverlight]16进制颜色转ARGB及Color转Int32

16进制色字符串转ARGB做Web的都喜欢用16进制字符串标识颜色&#xff0c;比如“#F5F5F5”这类的&#xff0c;自然这个到了Silverlight/WPF中就要用ARGB表示&#xff1a;“#FFF5F5F5”&#xff08;前两位标识Alpha&#xff0c;即透明度&#xff09;。这在XAML中没有任何问题&…

【转】DICOM通信 - PDU数据包(1)

转自&#xff1a;DICOM通信 - PDU数据包(1)_翼遥君的博客-CSDN博客 DICOM上层协议为DIMSE提供透明的网络数据传输服务&#xff0c;即以上层协议规定的协议数据单元传送接收DIMSE的命令流与数据流。上层协议中制定了上层服务以及协议数据单元(Protocol Data Unit&#xff0c;PD…

【转】DICOM通信 - PDU数据包(2)

转自&#xff1a;DICOM通信 - PDU数据包(2)_翼遥君的博客-CSDN博客 DICOM通信-PDU数据包(1)博客中主要分析了DICOM通信协议的连接协商请求和连接协商应答。 在7个PDU数据包中还有5个数据包&#xff0c;从结构上来看&#xff0c;他们比协议的协商过程要简单明了一些。 这篇博客…

“启动Word时提示出错,只能用安全模式才能打开”的解决方法

启动Word时提示出错&#xff0c;只能用安全模式才能打开&#xff0c;在这种模式下&#xff0c;一些功能将被禁用。而且&#xff0c;每次启动都会出现这样的提示信息&#xff0c;同事们很多向我求助。提示窗口如下&#xff1a; 于是我采取了以下一些措施&#xff1a; 1、用Offic…

DotNET内存管理与垃圾回收[转]

1. Stack&#xff08;栈&#xff09;和Heap&#xff08;堆&#xff09;每个线程对应一个stack&#xff0c;线程创建的时候CLR为其创建这个stack&#xff0c;stack主要作用是记录函数的执行情况。值类型变量&#xff08;函数的参数、局部变量等非成员变量&#xff09;都分配在st…

【转】WPF XAML X名称空间详解

转自&#xff1a;WPF XAML X名称空间详解_郎涯技术-CSDN博客 X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML编译器将XAML代码编译为CLR代码。 【X名称空间里面到底都有些什么】 x名称空间映射的是:http://schemas.microsoft.com/winfx/2006/xam…