`
Janne
  • 浏览: 44108 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

NET的webservice的优化

阅读更多

在网上找了一下资料,用WebService进行大量数据传送的人并不多,主要原因是因为传送速度慢,因为WebService是以XML文件流的方式来传送的,写过XML的人都知道,XML中会有很多冗余的内容,比说字段名,他是每一行就要写一次,如果有约束,还要附加很多描述语句,而且从WebService返回数据时,还要进行64位编码,所以用WebService进行通迅效率很低.找了好久终于找到了一位高手的文章,原来WebService可以通过三步瘦身,但他用的方法是VS2003+wse2.0,而我用的是Vs2008+Wse3.0写法有所不同,于是写下此日志,帮助自己记录,也希望帮到有相关需求的人.

 

正文:

  1. 将DataSet设置为用于远程传送的精简二进制模式
  2. 用压缩程序对数据进行压缩(此处使用微软提供的ICSharpCode.SharpZipLib.dll)
  3. 使用WSE3.0的MTOM技术优化SOAP.

WSE3.0配置:

安装完WSE3.0后,你会发现安装目录下会有一个WebService3.dll,要将其引入到WebService项目中(不能像VS2005中可以直接创建一个WSE3.0的项目),然后要配置Web.config,置于具体的配置写法可以用Wse3.0安装目录下的WseConfigEditor3.exe进行配置,例如要开通MTOM,则先在General页中勾选Enable this project for Web Service Enhancements,再在Messaging页中Client Mode选择on 然后关闭程序,会提示生成配置文件,打开文件,将相关项目填回Web.config中就可以使用了.

具体Web.config内容如下

1.<?xml version="1.0" encoding="utf-8"?>  
2.<configuration>  
3.  <configSections>  
4.    <section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />  
5.  </configSections>  
6.  <system.web>  
7.    <webServices>  
8.      <soapExtensionImporterTypes>  
9.        <add type="Microsoft.Web.Services3.Description.WseExtensionImporter, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />  
10.      </soapExtensionImporterTypes>  
11.      <soapServerProtocolFactory type="Microsoft.Web.Services3.WseProtocolFactory, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />  
12.    </webServices>  
13.    <compilation>  
14.      <assemblies>  
15.        <add assembly="Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />  
16.      </assemblies>  
17.    </compilation>  
18.  </system.web>  
19.  <microsoft.web.services3>  
20.    <messaging>  
21.      <mtom clientMode="On" />  
22.    </messaging>  
23.  </microsoft.web.services3>  
24.</configuration>  

 

具体代码:

一.压缩类:

  1. using System;  
  2. using System.IO;  
  3. using System.Text;  
  4. using ICSharpCode.SharpZipLib.Zip.Compression;  
  5. using ICSharpCode.SharpZipLib.Zip.Compression.Streams;  
  6.   
  7. namespace ClassLb1  
  8. {  
  9.     /// <summary>  
  10.     /// 压缩强度。  
  11.     /// </summary>  
  12.     public enum CompressionLevel  
  13.     {  
  14.         /// <summary>  
  15.         /// 采用最好的压缩率。  
  16.         /// </summary>  
  17.         BestCompression,  
  18.   
  19.         /// <summary>  
  20.         /// 采用默认的压缩率。  
  21.         /// </summary>  
  22.         DefaultCompression,  
  23.   
  24.         /// <summary>  
  25.         /// 采用最快的压缩速度。  
  26.         /// </summary>  
  27.         BestSpeed,  
  28.   
  29.         /// <summary>  
  30.         /// 不采用任何压缩。  
  31.         /// </summary>  
  32.         NoCompression  
  33.     }  
  34.   
  35.     /// <summary>  
  36.     /// CompressionHelper 的摘要说明。  
  37.     /// </summary>  
  38.     public class CompressionHelper  
  39.     {  
  40.         /// <summary>  
  41.         /// 获取和设置压缩强度。  
  42.         /// </summary>  
  43.         public CompressionLevel Level;  
  44.   
  45.         public CompressionHelper()  
  46.         {  
  47.             Level = CompressionLevel.DefaultCompression;  
  48.         }  
  49.   
  50.         public CompressionHelper(CompressionLevel level)  
  51.         {  
  52.             Level = level;  
  53.         }  
  54.  
  55.         #region Public Methods  
  56.         /// <summary>  
  57.         /// 从原始字节数组生成已压缩的字节数组。  
  58.         /// </summary>  
  59.         /// <param name="bytesToCompress">原始字节数组。</param>  
  60.         /// <returns>返回已压缩的字节数组</returns>  
  61.         public byte[] CompressToBytes(byte[] bytesToCompress)  
  62.         {  
  63.             MemoryStream ms = new MemoryStream();  
  64.             Stream s = GetOutputStream(ms);  
  65.             s.Write(bytesToCompress, 0, bytesToCompress.Length);  
  66.               
  67.             s.Close();  
  68.             return ms.ToArray();  
  69.         }  
  70.   
  71.         /// <summary>  
  72.         /// 从已压缩的字节数组生成原始字节数组。  
  73.         /// </summary>  
  74.         /// <param name="bytesToDecompress">已压缩的字节数组。</param>  
  75.         /// <returns>返回原始字节数组。</returns>  
  76.         public byte[] DecompressToBytes(byte[] bytesToDecompress)  
  77.         {  
  78.             byte[] writeData = new byte[4096];              //设置缓冲区  
  79.             Stream s2 = GetInputStream(new MemoryStream(bytesToDecompress));        //解压缩数组  
  80.             MemoryStream outStream = new MemoryStream();      //由于Stream类型不能直接转换为byte[]只能通过MemoryStream做中间变换  
  81.   
  82.             while (true)            //循环读取数据流到outStream,直至读取完毕  
  83.             {  
  84.                 int size = s2.Read(writeData, 0, writeData.Length);  
  85.                 if (size > 0)  
  86.                 {  
  87.                     outStream.Write(writeData, 0, size);  
  88.                 }  
  89.                 else  
  90.                 {  
  91.                     break;  
  92.                 }  
  93.             }  
  94.             s2.Close();  
  95.             byte[] outArr = outStream.ToArray();  
  96.             outStream.Close();  
  97.             return outArr;  
  98.         }  
  99.         #endregion  
  100.  
  101.         #region Private Methods  
  102.         /// <summary>  
  103.         /// 根据压缩强度返回使用了不用压缩算法的 Deflate 对象。  
  104.         /// </summary>  
  105.         /// <param name="level">压缩强度。</param>  
  106.         /// <returns>返回使用了不用压缩算法的 Deflate 对象。</returns>  
  107.         private Deflater GetDeflater(CompressionLevel level)  
  108.         {  
  109.             switch (level)  
  110.             {  
  111.                 case CompressionLevel.DefaultCompression:  
  112.                     return new Deflater(Deflater.DEFAULT_COMPRESSION);  
  113.   
  114.                 case CompressionLevel.BestCompression:  
  115.                     return new Deflater(Deflater.BEST_COMPRESSION);  
  116.   
  117.                 case CompressionLevel.BestSpeed:  
  118.                     return new Deflater(Deflater.BEST_SPEED);  
  119.   
  120.                 case CompressionLevel.NoCompression:  
  121.                     return new Deflater(Deflater.NO_COMPRESSION);  
  122.   
  123.                 default:  
  124.                     return new Deflater(Deflater.DEFAULT_COMPRESSION);  
  125.             }  
  126.         }  
  127.   
  128.         /// <summary>  
  129.         /// 从给定的流生成压缩输出流。  
  130.         /// </summary>  
  131.         /// <param name="inputStream">原始流。</param>  
  132.         /// <returns>返回压缩输出流。</returns>  
  133.         private DeflaterOutputStream GetOutputStream(Stream inputStream)  
  134.         {  
  135.             return new DeflaterOutputStream(inputStream, GetDeflater(Level));  
  136.         }  
  137.   
  138.         /// <summary>  
  139.         /// 从给定的流生成压缩输入流。  
  140.         /// </summary>  
  141.         /// <param name="inputStream">原始流。</param>  
  142.         /// <returns>返回压缩输入流。</returns>  
  143.         private InflaterInputStream GetInputStream(Stream inputStream)  
  144.         {  
  145.             return new InflaterInputStream(inputStream);  
  146.         }  
  147.         #endregion  
  148.   
  149.     }  
  150. }  

 

 

二.客户端:

  1. Thread thread1;  
  2. private void button1_Click(object sender, EventArgs e)  
  3. {  
  4.     //try  
  5.     //{  
  6.         label1.Text = "整理数据......";  
  7.         thread1 = new Thread(new ThreadStart(UpLoad));  
  8.         thread1.Start();  
  9.     //}  
  10.     //catch (Exception e1)  
  11.     //{  
  12.     //    MessageBox.Show("上传数据失败!错误代码如下:/r/n" + e1.ToString());  
  13.     //}  
  14. }  
  15.   
  16.   
  17. /// <summary>  
  18. /// 上传数据  
  19. /// </summary>  
  20. private void UpLoad()         
  21. {  
  22.     int LinLimit = 10;  
  23.   
  24.     string ZDDB1 = "ZD";  
  25.     string Prsta = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;  
  26.     //Prsta = Prsta.Substring(0, Prsta.LastIndexOf("//", Prsta.Length - 2));     //截取Prsta的路径  
  27.     SqlConn sqlConn = new SqlConn();  
  28.     SqlConnection Conn2 = sqlConn.Sqlc2(Prsta, ZDDB1);  
  29.     Conn2.Open();  
  30.     string sqlse1 = "select top 100 * from SqlLogOut";  
  31.     SqlDataAdapter sqlDa = new SqlDataAdapter(sqlse1, Conn2);  
  32.     SqlCommandBuilder scb = new SqlCommandBuilder(sqlDa);  
  33.       
  34.     DataSet Ds = new DataSet();  
  35.     sqlDa.Fill(Ds, "SqlLogOut");  
  36.   
  37.     label1.Text = "共有" + Ds.Tables[0].Rows.Count.ToString() + "条记录  开始上传..........";  
  38.   
  39.     int Loop1 = Ds.Tables[0].Rows.Count / LinLimit;                             //分包数  
  40.     if (Ds.Tables[0].Rows.Count % LinLimit > 0)  
  41.         Loop1++;  
  42.     for (int i = 1; i <= Loop1; i++)  
  43.     {  
  44.         DataSet DsPack = PackDs(Ds, LinLimit);  
  45.         DsPack.RemotingFormat = SerializationFormat.Binary;         //将DS设置为用于远程序传送的精简二进制模式  
  46.         BinaryFormatter BinForm = new BinaryFormatter();  
  47.         MemoryStream ms = new MemoryStream();  
  48.         BinForm.Serialize(ms, DsPack);  
  49.         byte[] buffer = ms.ToArray();  
  50.         byte[] byUpload = new CompressionHelper(CompressionLevel.BestSpeed).CompressToBytes(buffer);        //将byte数组再进行加压  
  51.   
  52.         localhost.DataTransport daTr = new DataTransport.localhost.DataTransport();  
  53.         string Res = daTr.DataUpload(byUpload);  
  54.         if (Res == "#1")  
  55.         {  
  56.             progressBar1.Value =Convert.ToInt16( Convert.ToDouble(i) / Loop1 * 100);  
  57.             sqlDa.Update(Ds, "SqlLogOut");                  //删除数据库上对应记录  
  58.         }  
  59.     }  
  60.     label1.Text = "上传完成.";  
  61.     Conn2.Close();  
  62.     thread1.Abort();  
  63. }  

 

 

三.WebService

  1. public string DataUpload(byte[] byUpload,string UpBm)  
  2. {  
  3.     try  
  4.     {  
  5.         byte[] byData = new CompressionHelper().DecompressToBytes(byUpload);  
  6.         BinaryFormatter binForm = new BinaryFormatter();  
  7.         DataSet dsUpload = binForm.Deserialize(new MemoryStream(byData)) as DataSet;  
  8.   
  9.         Bz1= "#1";  
  10.     }  
  11.     catch (Exception e1)  
  12.     {  
  13.         Bz1 = e1.Message.ToString();  
  14.     }  
  15.     return Bz1;  
  16. }  

 

经此方法可以将原数据量大大压缩2/3以上,只是原来的1/3左右

分享到:
评论

相关推荐

    浪曦][原创]WebService在.NET中的实战应用五

    5. **WebService在NET中的应用(五).ppt**:这是一个PowerPoint演示文稿,详细讲解了WebService在.NET环境中的第五部分应用,可能包括高级主题,如错误处理、安全性和性能优化。 6. **WebService动态调用.vsd**:这...

    log4net在webservice中的应用实例

    标题"Log4net在WebService中的应用实例"指出,我们要讨论的是如何在基于C#的Web服务(WebService)中利用Log4net这个日志记录框架。Log4net是Apache软件基金会的Jakarta项目的一部分,它提供了一个灵活且可扩展的...

    net调用webservice接口例子

    - 为了性能优化,考虑使用缓存或批量发送策略。 通过以上步骤,你可以成功地在.NET应用程序中调用一个短信服务的WebService接口。理解这些基本概念和操作,将有助于你实现更多类似的集成任务。

    WebService在·NET中的实战应用三

    - 这个PPT可能详细介绍了WebService在.NET中的实战应用,包括但不限于:如何创建和部署WebService,如何使用.NET客户端调用,以及可能涉及的错误处理和性能优化。 7. **Sql.sql** - 可能包含SQL脚本,用于在...

    ASP·NET与WebService实例剖析中文版

    【ASP·NET与WebService实例剖析中文版】 ASP·NET是微软公司推出的一种基于.NET Framework的服务器端编程模型,主要用于构建动态、数据驱动的Web应用程序。它提供了丰富的开发工具和库,使得开发者能够用C#、VB...

    C++中通过Webservice和HTTP协议的网络传输

    对于RESTful Webservice,可以使用C++库如cpprestsdk(原Casablanca)或Poco库的NetSSL模块。 5. **WebServer文件分析** 压缩包中的"WebServer"可能是一个简单的C++ Web服务器示例,用于演示如何接收和响应HTTP...

    调用webservice工具

    在实际开发中,这样的工具对于快速验证Web服务的正确性、调试服务端问题以及优化客户端调用策略都极其有用。对于C#开发者来说,掌握如何有效地利用这样的工具可以显著提高工作效率,减少因网络通信问题引起的调试...

    基于.NET和WebService的天气预报

    标题中的“基于.NET和WebService的天气预报”指的是一项利用微软的.NET框架和WebService技术来获取及展示天气预报...对于有经验的开发者,这个项目也可以作为参考,了解如何优化WebService调用和处理返回数据的流程。

    WebService在.NET中的实战应用二提高WebService性能(源码PPT等资源)

    3. PowerPoint演示:"WebService在NET中的应用(二).ppt"可能是对WebService性能优化的深入讲解,可能包括: - WSDL优化:精简Web服务描述语言(WSDL)文件,减少客户端解析时间。 - 错误处理:有效处理异常,避免...

    [浪曦][原创]WebService在.NET中的实战应用三

    6. **示例与演示**:教程附带的“WebService在NET中的应用(三).ppt”提供了详细的步骤说明和理论解释,而“WebService异步示意图.jpg”和“WebService异步示意图.vsd”是辅助理解异步调用流程的图表,帮助读者更好地...

    关于net. webservice修改wsdl标签名称

    本文将深入探讨如何在.NET中修改Web Service的WSDL标签名称,以满足特定的需求或优化服务的可读性和可维护性。 首先,WSDL文件是XML格式的,包含了Web服务的端点地址、操作方法、输入和输出消息等信息。在.NET中,...

    微信小程序与webservice(.net)数据交互用例

    在这个用例中,我们将探讨如何使微信小程序与.NET开发的Webservice进行数据交互。 首先,我们需要了解微信小程序的基本结构。微信小程序由JSON配置文件(app.json)、页面配置文件(page.json)、WXML(微信小程序...

    WebService在·NET中的实战应用二

    WebService在.NET中的实战应用主要涉及两个关键点:创建和调用Web服务,以及优化Web服务的性能。在.NET框架中,WebService是一种基于HTTP协议的、轻量级的、跨平台的通信方式,允许不同系统间的数据交换。 首先,...

    浪曦][原创]WebService在.NET中的实战应用二

    - `WebService在NET中的应用(二).ppt` 可能是一个关于WebService实战的PPT教程,详细讲解了如何在.NET中实现和使用WebService。 - `DataSetSurrogate.dll` 可能是一个用于优化DataSet序列化的组件,帮助提高数据传输...

    .NET平台下利用webservice开发的网上商铺

    最后,压缩包中的"点Net与WebService例子"可能包含了一个实际的项目示例,这将帮助开发者更直观地了解如何将理论知识应用到实践中。通过研究这个示例,可以学习到如何创建Web服务、如何在.NET环境中调用Web服务,...

    Node性能跟踪与稳定性优化

    在Node.js应用中,数据中间层通常负责处理HTTP请求,并通过SQL接口与后端数据库如MySQL、HBase或WebService交互。例如,下面这段SQL查询语句展示了如何从两个表中获取数据: ```sql SELECT r.query, search_num, s....

    webserver示例

    4. **ASP.NET WebService实例**:文件名中的“asp_net web service实例,Asp_net实例教程,Asp_net系列教程,Asp_net.htm”表明有具体的步骤和指导,帮助初学者了解如何创建、部署和测试ASP.NET WebService。...

    dotnet-Nelibur在纯WCF实现基于消息的webservice框架

    7. **监控和日志记录**:通过集成日志记录库,如log4net,Nelibur可以帮助开发者跟踪服务运行状态,进行性能优化和问题排查。 8. **高性能和可扩展性**:Nelibur设计时考虑了性能优化,避免了不必要的性能开销,...

    异步调用Web Service程序 小例子,C++.net源代码编写

    在IT领域,异步编程是一种常见的优化性能的技术,特别是在处理耗时操作如网络通信时,如调用Web Service。Web Service是一种基于XML的接口,允许应用程序通过HTTP协议进行通信,实现跨平台的数据交换。本篇将详细...

    C#实现汉字转拼音,调用WebServise

    这个场景通常出现在需要处理中文字符并将其转换为拼音的软件应用中,例如搜索引擎优化、语音识别或自动文本处理。下面我们将详细探讨这两个主要知识点。 首先,我们要理解汉字转拼音的过程。在C#中,可以借助.NET...

Global site tag (gtag.js) - Google Analytics