<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_heros</title><subtitle type="text">程序开发</subtitle><id>http://feed.cnblogs.com/blog/u/32618/rss</id><updated>2011-12-27T02:57:14Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/32618/rss"/><entry><id>http://www.cnblogs.com/heros/archive/2011/12/27/2303157.html</id><title type="text">url不重复会造成asp.net的私有缓存占用内存过高</title><summary type="text">url不重复会造成asp.net的私有缓存占用内存过高</summary><published>2011-12-27T02:57:00Z</published><updated>2011-12-27T02:57:00Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heros/archive/2011/12/27/2303157.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/archive/2011/12/27/2303157.html"/><content type="html">&lt;p style="margin-left: 30px;"&gt;asp.net中会对url做MapPath缓存，并且这个缓存的过期时间是never。当url中带有不重复参数时，会造成url的不重复，同时会造成asp.net的私有缓存中存储大量MapPathCacheInfo对象，缓存类型是System.Web.Cache.CacheEntry。在asp.net4正式版中提供了补丁可以对asp.net4版本上的这个问题进行修补&lt;a href="http://support.microsoft.com/kb/2504047"&gt;http://support.microsoft.com/kb/2504047&lt;/a&gt;，修补后可以通过在System.web中添加配置项&amp;lt;hostingEnvironment urlMetadataSlidingExpiration="hh:mm:ss"/&amp;gt;来控制私有缓存的过期时间，建议将urlMetadataSlidingExpiration设置为00:00:00。&lt;br /&gt;记录&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heros/aggbug/2303157.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heros/archive/2011/12/27/2303157.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heros/archive/2011/03/08/1977001.html</id><title type="text">回“血泪八条---给中国IT教育培训机构” （因评论一再被银光小子删除，所以决定另开一文）</title><summary type="text">回“血泪八条---给中国IT教育培训机构” （因评论一再被银光小子删除，所以决定另开一文）</summary><published>2011-03-08T03:18:00Z</published><updated>2011-03-08T03:18:00Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heros/archive/2011/03/08/1977001.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/archive/2011/03/08/1977001.html"/><content type="html">&lt;p style="padding-left: 30px;"&gt;因为评论内容一再被&lt;a id="Header1_HeaderTitle"  href="http://www.cnblogs.com/MySilverlight/"&gt;银光小子&lt;/a&gt;删除，所以决定另开一文。&lt;strong&gt;此为水文，一会本人会自行移除。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;对于&lt;a href="http://www.cnblogs.com/MySilverlight/"  id="Header1_HeaderTitle"&gt;银光小子&lt;/a&gt;删评论的原因，呵呵，不想过多猜测，套句时下流行的话，你懂的。不过这种行为还是挺阴暗的。&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;首先,培训机构是商业机构，在这个浮躁的炒的年代，不要奢望一个商业机构能有多么的踏实。&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;学费高:是商业运作成本的问题，培训机构招进一名学员的成本平均在2000元+，另外加盟成本是学生交的钱的25%以上，一个培训中心就不可能靠低学费来生存。&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;教职水平低：这一点不能一概而论，但也是个实际存在的现象，出于成本考虑，培训机构给教员开的薪水基本上是底薪加课时提成，每个月没日没夜的上到200课时的课也就能挣个10k&lt;br /&gt;。200课时是个什么概念，也就是30天每天讲6节课。可以自己试试，找个人坐下来喝茶聊天六个钟头你也受不了。一个有成熟开发经验的人，如果在公司正常的职业发展，&lt;br /&gt;两三年也就轻轻松松差不多这个薪资(我说的是有成熟开发经验的人)。真有能力的谁愿意放弃自己的职业发展，教一辈子书呢。&lt;br /&gt;本人不才，原来也做过教员，本人水平不行，但在中心能算是技术高手，也就可见一斑了。&lt;/p&gt;&#xD;
&lt;p style="padding-left: 30px;"&gt;夸大的广告：这一点也不是仅是培训行业的事，电视上的广告哪一个不夸大、哪一个挑不出虚假？另外不打广告也是不可能的事，很多品牌效应不是靠产品，而就是靠成功的广告。&lt;br /&gt;培训机构的学员大部分就是被高考筛选下来的，整体学习素质就差一些，想在一年的时间就把他们打造成实力精英并以此深巷飘香，你觉得可能吗。&lt;/p&gt;&#xD;
&lt;p&gt;培训机构确有很多万恶之行为，但话说回来，你本可以不去参加，真的有理想有毅力，就像老赵说的那样自学成才，何苦如今在此抱怨呢。&lt;/p&gt;&#xD;
&lt;p&gt;软件开发很大的成本在于自身的修练和积累，即使是初学也需要通过大量的练习来沉淀自己的经验。而这些关键的东西，培训中心给不了。&lt;/p&gt;&#xD;
&lt;p&gt;请记住一点，成功的主导在于内因，不要过多的苛求外因。&lt;/p&gt;&#xD;
&lt;p&gt;如果你渴望光明，请先去除自己的阴暗。&lt;/p&gt;&#xD;
&lt;p&gt;重发一下被一再删除的评论内容。&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;呵呵，我是搞技术的，对招生一无所知。&lt;br /&gt;另外请不要随便删除评论。 &lt;br /&gt;&lt;br /&gt;重发:&lt;br /&gt;另外每个人的路都是自己的选择，你本可以选择不去参加培训。&lt;br /&gt;每个年轻人，如果你真的有毅力，有理想，就像老赵说的，自己自学成才。&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&lt;img src="http://www.cnblogs.com/heros/aggbug/1977001.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heros/archive/2011/03/08/1977001.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heros/archive/2011/01/14/1935706.html</id><title type="text">android gif 图片显示问题</title><summary type="text">关于android显示gif图片网上有很多人都给出了解决方案，但并不是所有gif都能显示。</summary><published>2011-01-14T08:21:00Z</published><updated>2011-01-14T08:21:00Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heros/archive/2011/01/14/1935706.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/archive/2011/01/14/1935706.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于android显示gif图片网上有很多人都给出了解决方案。主要是两种，一种是使gif解码器在程序运行时解码gif，并将gif中帧提取并显示。还有一种就是预先用工具将gif帧打散成n张图，程序中切换加载来显示。两种方法都可以解决部分gif图片的显示问题。&lt;/p&gt;&#xD;
&lt;p&gt;在实际应用中，遇到一些很奇怪的gif图片，有一些帧是非完整图片，这些帧需要在前一些帧基础上合并显示。对于这样的图片逐帧提取单独显示时就会有问题。比如图片中一只小鸟在树林中飞行，那呈现的效果就成了第一张显示出树林，然后显示空白背景中一只小鸟，如果没有处理好小鸟所在帧的宽高和帧坐标，那么显示出的小鸟可能会被拉伸填满imageview区。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;解决方案其实很简单，不能单张单张的呈现帧，要将帧连续起来，另外要将各帧的坐标及宽高信息全部提取并应用到帧的显示中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;gif文件转成字节流后，7、8字节代表gif框宽，9、10字节代表gif框高。在图像数据块的1、2字节表示x坐标偏移，3、4字节表示y坐标偏移，5、6和7、8分别表示当前帧的宽和高&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] bytes &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; stream.toByteArray();&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; width &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; bytes[&lt;/span&gt;&lt;span style="color: #000000;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt;bytes[&lt;/span&gt;&lt;span style="color: #000000;"&gt;7&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;gif框宽&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; height &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; bytes[&lt;/span&gt;&lt;span style="color: #000000;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt;bytes[&lt;/span&gt;&lt;span style="color: #000000;"&gt;9&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;gif框高&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在呈现图片时，用叠加的方式来显示图片，图片绘制时根据容器矩形、gif矩形、帧矩形信息来计算在容器中的绘图区，就不会有问题了。另外记得帧转换成bmp时，颜色取argb，这样可以保留透明等效果。&lt;/p&gt;&#xD;
&lt;p&gt;因为是公司项目代码不方便公开提供下载。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heros/aggbug/1935706.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heros/archive/2011/01/14/1935706.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heros/archive/2010/12/25/1916937.html</id><title type="text">注意TDes8 -&amp;gt; Expand方法</title><summary type="text">注意TDes8 -&gt; Expand方法</summary><published>2010-12-25T13:42:00Z</published><updated>2010-12-25T13:42:00Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heros/archive/2010/12/25/1916937.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/archive/2010/12/25/1916937.html"/><content type="html">&lt;p&gt;今天在写程序时，用到了动态缓冲CBufFlat，在读取数据后想当然的使用了TDes8的Expand()方法将TDes8改为TDes16，当然程序报错了，模拟器直接退出，很显然程序发生严重错误。通过实践后发现Expand并非通过扩展内存区域来实现8bit转16bit，而是使用现有的描述符内存区域大小，只是进行了内存合并，两个8成了一个16，如果8位描述符中信息已经超出了最大长度一半，则会转换失败。Expand方法在使用时还可能因为内存地址非偶数地址而发生转换失败。&lt;/p&gt;&#xD;
&lt;p&gt;随笔记录，以防再错。也请大家指点。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heros/aggbug/1916937.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heros/archive/2010/12/25/1916937.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heros/archive/2010/12/19/1910562.html</id><title type="text">简单的字符串相似度计算</title><summary type="text">Levenshtein distance and string similarity</summary><published>2010-12-19T07:05:00Z</published><updated>2010-12-19T07:05:00Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heros/archive/2010/12/19/1910562.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/archive/2010/12/19/1910562.html"/><content type="html">&lt;p&gt;计算Levenshtein 距离，再和较长字符串求比率&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('4a53a2f8-4281-474d-9711-c9ed7ecde4e1')"&gt;&#xD;
&lt;div id="cnblogs_code_open_4a53a2f8-4281-474d-9711-c9ed7ecde4e1" &gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; Levenshtein Distance&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; StringExt&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 计算两个字符串的差异距离&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="source"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;来源字符串&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="target"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;目标字符串&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;字符串差距&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; CalcDistance(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; source, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; target)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; source.Length;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; m &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; target.Length;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (m &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; n;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (n &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; m;&lt;br /&gt;            var matrix &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;[n &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, m &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; n; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                matrix[i, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; i;&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; m; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                matrix[&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, i] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; i;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; n; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            {&lt;br /&gt;                var si &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; source[i &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; j &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; j &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; m; j&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                {&lt;br /&gt;                    var tj &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; target[j &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; cost;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (si &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; tj)&lt;br /&gt;                        cost &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                        cost &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; above &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; matrix[i &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, j] &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; left &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; matrix[i, j &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; diag &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; matrix[i &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, j &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;] &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; cost;&lt;br /&gt;                    matrix[i, j] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Math.Min(above, Math.Min(left, diag));&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; matrix[n, m];&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 计算两个字符串的相似度&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="source"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;来源字符串&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="target"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;目标字符串&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;相似度&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt; CalcSimilarity(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; source, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; target)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; n &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; source.Length;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; m &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; target.Length;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (n &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; m &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; distance &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; source.CalcDistance(target);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; max &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Math.Max(n, m);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1.0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; (max &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt; distance) &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt; max;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heros/aggbug/1910562.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heros/archive/2010/12/19/1910562.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heros/archive/2010/12/06/1897629.html</id><title type="text">[转]Carbide.VS 3.0.1的安装问题</title><summary type="text">Carbide.VS 3.0.1的安装问题</summary><published>2010-12-06T04:24:00Z</published><updated>2010-12-06T04:24:00Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heros/archive/2010/12/06/1897629.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/archive/2010/12/06/1897629.html"/><content type="html">&lt;p&gt;在Carbide.VS过程中一个常见的问题是检测不到已安装的SDK，特别是S60v3 FP2。这样的话，安装无法完成，恼人得很。找了很久才找到&lt;a href="http://wiki.forum.nokia.com/index.php/KIS001048_-_S60_Platform_SDK_-_Workarounds_and_Updates#S60_3rd_Edition.2C_FP2_SDK_v1.1"&gt;解决的办法&lt;/a&gt;。&lt;br /&gt;&amp;nbsp; 步骤1：&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 打开注册表，找到"HKEY_LOCAL_MACHINE\SOFTWARE\Nokia\"，创建新项"Carbide.vs.30",然后在新项里添加字符串值"ForcePrereq" = "1"。&lt;span style="color: #000000;"&gt;（这一步是为了让安装程序略过SDK的检测）&lt;/span&gt;&lt;br /&gt;&amp;nbsp; 步骤2：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 安装完成后，下载文件&lt;a  title="http://wiki.forum.nokia.com/images/a/ad/S60_3rd_FP2_v2.xml.zip" rel="nofollow" href="http://wiki.forum.nokia.com/images/a/ad/S60_3rd_FP2_v2.xml.zip"&gt;S60_3rd_FP2_v2.xml&lt;/a&gt;到&lt;em&gt;&amp;lt;drive:&amp;gt;\Program Files\Common Files\Symbian\SDK Descriptors\Nokia&lt;/em&gt;目录。&lt;span style="color: #000000;"&gt;（这一步是为了让Carbide.VS激活SDK）&lt;/span&gt;&lt;br /&gt;&amp;nbsp; 到此，Carbide.vs就可以正常使用了;-)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;http://files.cnblogs.com/heros/S60_3rd_FP2_v2.xml.zip&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;vs2005开发5th版本sdk的descriptor&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/heros/vs2005%e5%bc%80%e5%8f%915th_Sdk_descriptor%e6%96%87%e4%bb%b6.rar"&gt;5th sdk descriptor&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heros/aggbug/1897629.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heros/archive/2010/12/06/1897629.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heros/archive/2010/10/11/1848358.html</id><title type="text">分享SharpDevelop Asp.net DevServer插件</title><summary type="text">分享SharpDevelop Asp.net DevServer插件</summary><published>2010-10-11T15:55:00Z</published><updated>2010-10-11T15:55:00Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heros/archive/2010/10/11/1848358.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/archive/2010/10/11/1848358.html"/><content type="html">&lt;p&gt;因为电脑让给老婆用，自己只有上网本一个，要装vs还是太吃力。SharpDevelop是个好的选择，但是有个问题，asp.net程序开发时运行和调试是个问题，老是要挂到iis上。索性把vs的DevServer移了过来。用插件的方式，增加了Debug in Browser和View in browser右键菜单，直接运行，方便许多。&lt;/p&gt;&#xD;
&lt;p&gt;For SharpDevelop 3.2&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/heros/SharpDevelopWebRunnerAddIn.rar"&gt;http://files.cnblogs.com/heros/SharpDevelopWebRunnerAddIn.rar&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;For SharpDevelop 4.0&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/heros/WebRunner4.rar" target="_blank"&gt;http://files.cnblogs.com/heros/WebRunner4.rar&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/29064/2010101123521355.jpg" alt="" width="536" height="302" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heros/aggbug/1848358.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heros/archive/2010/10/11/1848358.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heros/archive/2010/09/28/1837687.html</id><title type="text">算法题:装备合成</title><summary type="text">你有一些合成元素对象，按指定数量的类型的合成元素可以合成一些装备，合成时候会有一些费用，合成的装备可以卖出，合成元素本身可以卖出。合成一个装备后，剩余元素个数只要还够合成，可以继续合成，也可以选择不合成。要求所有东西卖出后收入最大化。一个现实业务精简来的问题，背包、规划或自己的思路都可以。你试一试吧。</summary><published>2010-09-28T08:40:00Z</published><updated>2010-09-28T08:40:00Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heros/archive/2010/09/28/1837687.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/archive/2010/09/28/1837687.html"/><content type="html">&lt;p&gt;你有一些合成元素对象，按指定数量的类型的合成元素可以合成一些装备，合成时候会有一些费用，合成的装备可以卖出，合成元素本身可以卖出。合成一个装备后，剩余元素个数只要还够合成，可以继续合成，也可以选择不合成。&lt;/p&gt;&#xD;
&lt;p&gt;要求所有东西卖出后收入最大化。&lt;/p&gt;&#xD;
&lt;p&gt;一个现实业务精简来的问题，背包、规划或自己的思路都可以。你试一试吧。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heros/aggbug/1837687.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heros/archive/2010/09/28/1837687.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heros/archive/2010/07/15/1778315.html</id><title type="text">asp.net treeview 复选后展开的bug</title><summary type="text">第一次展开勾选了复选框的节点后。树的层次关系会乱掉。通过检查生成的html，发现原来是生成的html中缺少了用来完成缩进的div。不知道是不是asp.net4的bug。记得旧版本上没有问题的。http://files.cnblogs.com/heros/ADTreeView.rar</summary><published>2010-07-15T10:00:00Z</published><updated>2010-07-15T10:00:00Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heros/archive/2010/07/15/1778315.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/archive/2010/07/15/1778315.html"/><content type="html">&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/heros/201007/2010071517542026.jpg" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第一次展开勾选了复选框的节点后。树的层次关系会乱掉。通过检查生成的html，发现原来是生成的html中缺少了用来完成缩进的div。不知道是不是asp.net4的bug。记得旧版本上没有问题的。&lt;/p&gt;&#xD;
&lt;p&gt;http://files.cnblogs.com/heros/ADTreeView.rar&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heros/aggbug/1778315.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heros/archive/2010/07/15/1778315.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/heros/archive/2010/03/09/1681264.html</id><title type="text">[转]WebService压缩</title><summary type="text">WebService压缩 Compression Extension</summary><published>2010-03-09T01:14:00Z</published><updated>2010-03-09T01:14:00Z</updated><author><name>heros</name><uri>http://www.cnblogs.com/heros/</uri></author><link rel="alternate" href="http://www.cnblogs.com/heros/archive/2010/03/09/1681264.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/heros/archive/2010/03/09/1681264.html"/><content type="html">&lt;p align="left"&gt;&lt;b&gt;原文:&lt;a href="http://www.mastercsharp.com/article.aspx?ArticleID=86&amp;amp;&amp;amp;TopicID=7"&gt;http://www.mastercsharp.com/article.aspx?ArticleID=86&amp;amp;&amp;amp;TopicID=7&lt;/a&gt;&lt;br /&gt;Introduction&lt;/b&gt;&lt;br /&gt;Web Services have already been standardized and its usage if definitely on the rise. Developers are quickly finding new and better ways to apply Web Services in their existing or new application designs. Reviewing many of the Web Services designs I have noticed that developers are increasingly performing heavy weight tasks (passing large SOAP messages) using Web Services. They are passing thousands of records through the Web Methods, there is nothing wrong with this approach, but the only problem (or nightmare) that comes forward is the size of data being passed around. Web Services use XML formatted SOAP messages to communicate but XML is a very verbose language and it can certainly add-up a lot to the size of data being transferred. Global bandwidth conditions do not currently warrant such massive data transfer easily.&lt;br /&gt;One solution to this would be to compress (zip) the SOAP Message before sending it across the wire and then deflate (unzip) the data back on the client. This will help to reduce the amount of data transferred over the wire drastically! Luckily, the .NET Framework provides a very extensible Web Services API which makes it very easy to implement this functionality. &lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;b&gt;SOAP Extensions&lt;/b&gt;&lt;br /&gt;The .NET Web Service API uses &lt;i&gt;SOAP Extensions&lt;/i&gt; to provide hooks for developers into the messaging Web Service architecture, both on the client and server side. SOAP Extensions are used to inspect ( and modify ) the SOAP Message at each stage in the Web Services communication cycle.&lt;br /&gt;To visualize the life cycle of a SOAP Request and Response, consider this scenario the client (of the Web Service) prepares the parameters (if any) and then calls the web method through the proxy class. Here the proxy class, inspects the method parameters, marshals them into XML format (serialization) and creates a SOAP Message. This SOAP message is then sent to the server&amp;nbsp; (Web Service). The Web Service receives the SOAP message it converts (deserializes) the XML formatted parameters into the language data-types and then invokes the relevant method. Next, the method on the server-side executes, does the necessary processing and it may return a value. The return value is again marshaled (serialized) into a SOAP message and sent back to the client. The client proxy receives the SOAP message converts (deserializes) the XML value and returns it back to the calling class. In short both client and server carry the task of serialization and deserialization.&lt;br /&gt;SOAP Extensions in ASP.NET allow you to inspect and alter the SOAP Message at all the stages of the XML Web Service Lifetime both at client and server side. This provides you with a very powerful way to extend the existing Web Service framework to suit your requirements.&lt;br /&gt;You can learn more about the &lt;a target="_blank" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconanatomyofsoapwebservicelifetime.asp"&gt;Anatomy of an XML Web Services Lifetime&lt;/a&gt; in the MSDN documentation. &lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;b&gt;SOAP Message Compression&lt;/b&gt;&lt;br /&gt;Currently, there are no standards involving compression of SOAP Messages, hence we are on our own implement a suitable extension. I have chosen to use zip algorithm, you can feel free to choose your own algorithm, but since I am using industry standard algorithms I can be sure they will be supported across platforms and programming languages. I am using the &lt;b&gt;#ziplip&lt;/b&gt; library from &lt;a target="_blank" href="http://icsharpcode.net/OpenSource/SharpZipLib/default.asp"&gt;ICSharpCode&lt;/a&gt; which is a &lt;a target="_blank" href="http://www.gnu.org/"&gt;GPL&lt;/a&gt; based implementation for the standard ZIP, GZIP, TAR and BZip2 algorithms in C# (with source code) by &lt;a href="mailto:mike@icsharpcode.net"&gt;Mike Krueger&lt;/a&gt;. A special thanks to Mike Krueger for developing such a wonderful library in C#! &lt;/p&gt;&#xD;
&lt;p align="left"&gt;Another important question that comes into mind is Should we compress the whole SOAP Message before we send it across the wire or parts of it? The up-coming new standards rely a lot on the &lt;i&gt;SOAP Headers&lt;/i&gt;, hence we chosen not to compress the SOAP Headers since they might be needed in plain XML format for your Web Service to function correctly. So we just compress the &lt;i&gt;contents&lt;/i&gt; of the SOAP Body and then send the message across the wire. Also remember we are implementing this extension on both the client and server side, so all communication between the client and server will be compressed.&lt;br /&gt;&lt;br /&gt;Please note that you will have to download and install the &lt;i&gt;#ziplib&lt;/i&gt; library on both the client and server for this extension to work correctly. Instructions for installation of the library are clearly outlined in the support documentation. &lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;b&gt;Let's Dive into some code.&lt;/b&gt;&lt;br /&gt;In order to implement a SOAP Extension we need to define 2 classes, the first class extends the &lt;i&gt;SoapExtention&lt;/i&gt; class and it contains all the processing logic for the extension. The class extends the &lt;i&gt;SoapExtensionAttribute&lt;/i&gt; class which is the attribute used to apply on the Web Methods that need to support the SOAP Extension.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CompressionExtension&lt;/b&gt;&lt;br /&gt;In the &lt;i&gt;CompressionExtension&lt;/i&gt; class I check for the two stages, &lt;i&gt;AfterSerialize&lt;/i&gt; and &lt;i&gt;BeforeDeserialize&lt;/i&gt;. In the &lt;i&gt;AfterSerialize&lt;/i&gt; stage, I inspect the contents of the SOAP Body and zip them, then the zipped stream is saved back into the SOAP Body and the SOAP Message is passed over the wire. On the other hand in &lt;i&gt;BeforeDeserialize&lt;/i&gt; stage, I inspect the SOAP Body and retrieve the zipped contents, unzip them, and restore the original content. Later, the SOAP Message is sent to the Web Method for processing.&lt;br /&gt;Also remember while zipping the XML nodes we get a binary array, but binary arrays are not correctly represented in XML Web Services, hence we have to use Base64 encoding to convert the binary array into appropriate format.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; As per &lt;b&gt;Tobias Gansen&lt;/b&gt;'s suggestion, the source code has been updated. Now I use &lt;i&gt;InnerXml&lt;/i&gt; instead of &lt;i&gt;InnetText&lt;/i&gt; to retrieve the contents of the SOAP Body, so complex obhjects like DataSet's are correctly handled.&lt;br /&gt;25 October 2002 - As per &lt;b&gt;Don Bunt&lt;/b&gt;'s suggestion the code has been updated. Now all the WebMethod parameters get compressed correctly.&lt;br /&gt;&amp;nbsp; &lt;/p&gt;&#xD;
&lt;table cellpadding="0" border="1" style="width: 100%;"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="100%"&gt;&#xD;
&lt;div onclick="cnblogs_code_show('68799532-0e2e-47f4-9feb-1d95fc26a0e1')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div  id="cnblogs_code_open_68799532-0e2e-47f4-9feb-1d95fc26a0e1"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Text ;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Services;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Services.Protocols ;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ICSharpCode.SharpZipLib.Checksums;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ICSharpCode.SharpZipLib.Zip;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; ICSharpCode.SharpZipLib.GZip;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Xml ;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; MasterCSharp.WebServices&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; Summary description for ConpressionExtension.&lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CompressionExtension : System.Web.Services.Protocols.SoapExtension&lt;br /&gt;&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt;    Stream oldStream;&lt;br /&gt;&lt;br /&gt;    Stream newStream;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetInitializer(LogicalMethodInfo methodInfo,&lt;br /&gt;&lt;br /&gt;                               SoapExtensionAttribute attribute)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; attribute;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get the Type&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetInitializer(Type t)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(CompressionExtension);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Get the CompressionExtensionAttribute&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Initialize(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; initializer)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      CompressionExtensionAttribute attribute &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;               (CompressionExtensionAttribute) initializer;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Process the SOAP Message&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; ProcessMessage(SoapMessage message)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Check for the various SOAP Message Stages &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (message.Stage)&lt;br /&gt;&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; SoapMessageStage.BeforeSerialize:&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; SoapMessageStage.AfterSerialize:&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; ZIP the contents of the SOAP Body after it has&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; been serialized&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;          Zip();&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; SoapMessageStage.BeforeDeserialize:&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Unzip the contents of the SOAP Body before it is&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; deserialized&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;          Unzip();&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt;&lt;span style="color: #000000;"&gt; SoapMessageStage.AfterDeserialize:&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Exception(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;invalid stage&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Gives us the ability to get hold of the RAW SOAP message&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; Stream ChainStream( Stream stream )&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      oldStream &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; stream;&lt;br /&gt;&lt;br /&gt;      newStream &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; newStream;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Utility method to copy streams&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Copy(Stream from, Stream to)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      TextReader reader &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StreamReader(from);&lt;br /&gt;&lt;br /&gt;      TextWriter writer &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StreamWriter(to);&lt;br /&gt;&lt;br /&gt;      writer.WriteLine(reader.ReadToEnd());&lt;br /&gt;&lt;br /&gt;      writer.Flush();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Zip the SOAP Body&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Zip()&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      newStream.Position &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Zip the SOAP Body&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      newStream &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ZipSoap(newStream);&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Copy the streams&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      Copy(newStream, oldStream);&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; The actual ZIP method&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] Zip(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; stringToZip)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] inputByteArray &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Encoding.UTF8.GetBytes(stringToZip);&lt;br /&gt;&lt;br /&gt;      MemoryStream ms &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Check the #ziplib docs for more information&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      ZipOutputStream zipOut &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ZipOutputStream( ms ) ;&lt;br /&gt;&lt;br /&gt;      ZipEntry ZipEntry &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ZipEntry(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ZippedFile&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;      zipOut.PutNextEntry(ZipEntry);&lt;br /&gt;&lt;br /&gt;      zipOut.SetLevel(&lt;/span&gt;&lt;span style="color: #800080;"&gt;9&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;      zipOut.Write(inputByteArray, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; , inputByteArray.Length ) ;&lt;br /&gt;&lt;br /&gt;      zipOut.Finish();&lt;br /&gt;&lt;br /&gt;      zipOut.Close();&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Return the zipped contents&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ms.ToArray();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Select and Zip the appropriate parts of the SOAP message&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream ZipSoap(Stream streamToZip)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      streamToZip.Position &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Load a XML Reader&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      XmlTextReader reader &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; XmlTextReader(streamToZip);&lt;br /&gt;&lt;br /&gt;      XmlDocument dom &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; XmlDocument();&lt;br /&gt;&lt;br /&gt;      dom.Load(reader);&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Load a NamespaceManager to enable XPath selection&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      XmlNamespaceManager nsmgr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; XmlNamespaceManager(dom.NameTable);&lt;br /&gt;&lt;br /&gt;      nsmgr.AddNamespace(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;soap&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://schemas.xmlsoap.org/soap/envelope/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;      XmlNode node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; dom.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;//soap:Body&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, nsmgr);&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Select the contents within the method defined in the SOAP body&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; node.FirstChild.FirstChild;&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Check if there are any nodes selected&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;( node &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br /&gt;&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( node.InnerXml.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br /&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Zip the data&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] outData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Zip(node.InnerXml);&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Convert it to Base64 for transfer over the internet&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;          node.InnerXml &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Convert.ToBase64String(outData) ;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Move to the next parameter&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; node.NextSibling ; &lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      MemoryStream ms &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Save the updated data&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      dom.Save(ms);&lt;br /&gt;&lt;br /&gt;      ms.Position &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ms;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Unzip the SOAP Body&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Unzip()&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      MemoryStream unzipedStream &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      TextReader reader &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StreamReader(oldStream);&lt;br /&gt;&lt;br /&gt;      TextWriter writer &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StreamWriter(unzipedStream);&lt;br /&gt;&lt;br /&gt;      writer.WriteLine(reader.ReadToEnd());&lt;br /&gt;&lt;br /&gt;      writer.Flush();&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Unzip the SOAP Body&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      unzipedStream &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; UnzipSoap(unzipedStream);&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Copy the streams&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      Copy(unzipedStream, newStream);&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      newStream.Position &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Actual Unzip logic&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] Unzip(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; stringToUnzip)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Decode the Base64 encoding&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] inputByteArray &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Convert.FromBase64String( stringToUnzip ) ;&lt;br /&gt;&lt;br /&gt;      MemoryStream ms &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream(inputByteArray) ;&lt;br /&gt;&lt;br /&gt;      MemoryStream ret &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Refer to #ziplib documentation for more info on this&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      ZipInputStream zipIn &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ZipInputStream(ms);&lt;br /&gt;&lt;br /&gt;      ZipEntry theEntry &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; zipIn.GetNextEntry();&lt;br /&gt;&lt;br /&gt;      Byte[] buffer &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Byte[&lt;/span&gt;&lt;span style="color: #800080;"&gt;2048&lt;/span&gt;&lt;span style="color: #000000;"&gt;] ;&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; size &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;2048&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt;        size &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; zipIn.Read(buffer, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, buffer.Length);&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (size &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;          ret.Write(buffer, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, size);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ret.ToArray();&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Unzip the SOAP Body&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream UnzipSoap(Stream streamToUnzip)&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      streamToUnzip.Position &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Load a XmlReader&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      XmlTextReader reader &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; XmlTextReader(streamToUnzip);&lt;br /&gt;&lt;br /&gt;      XmlDocument dom &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; XmlDocument();&lt;br /&gt;&lt;br /&gt;      dom.Load(reader);&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      XmlNamespaceManager nsmgr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; XmlNamespaceManager(dom.NameTable);&lt;br /&gt;&lt;br /&gt;      nsmgr.AddNamespace(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;soap&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://schemas.xmlsoap.org/soap/envelope/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Select the SOAP Body node &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      XmlNode node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; dom.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;//soap:Body&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, nsmgr);&lt;br /&gt;&lt;br /&gt;      node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; node.FirstChild.FirstChild;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Check if node exists&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;( node &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br /&gt;&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( node.InnerXml.Length &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br /&gt;&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Send the node's contents to be unziped&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] outData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Unzip(node.InnerXml);&lt;br /&gt;&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; sTmp &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Encoding.UTF8.GetString(outData);&lt;br /&gt;&lt;br /&gt;          node.InnerXml &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; sTmp;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Move to the next parameter&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        node &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; node.NextSibling ; &lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      MemoryStream ms &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MemoryStream();&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      dom.Save(ms);&lt;br /&gt;&lt;br /&gt;      ms.Position &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ms;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p align="left"&gt;&lt;b&gt;CompressionExtensionAttribute&lt;/b&gt;&lt;br /&gt;This class defines an Attribute which will be used to mark-up Web Methods that need to be compressed. This class inherits the &lt;i&gt;SoapExtensionAttribute&lt;/i&gt; class and overrides its &lt;i&gt;ExtensionType&lt;/i&gt; and &lt;i&gt;Priority&lt;/i&gt; properties.&lt;/p&gt;&#xD;
&lt;table cellpadding="0" border="1" style="width: 100%;"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="100%"&gt;&#xD;
&lt;div onclick="cnblogs_code_show('8b9d22c1-4c30-4c59-a814-657ad1410df4')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div  id="cnblogs_code_open_8b9d22c1-4c30-4c59-a814-657ad1410df4"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Services;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Services.Protocols;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; MasterCSharp.WebServices&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; Summary description for CompressionExtensionAttribute.&lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Make the Attribute only Applicable to Methods&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;  [AttributeUsage(AttributeTargets.Method)]&lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CompressionExtensionAttribute : SoapExtensionAttribute&lt;br /&gt;&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; priority;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Override the base class properties&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; Type ExtensionType&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt; { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(CompressionExtension); }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; Priority&lt;br /&gt;&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; priority;&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;      {&lt;br /&gt;&lt;br /&gt;        priority &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; value;&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p align="left"&gt;&lt;b&gt;Code Compilation&lt;/b&gt;&lt;br /&gt;Once you have the &lt;b&gt;CompressionExtension.cs&lt;/b&gt; and &lt;b&gt;CompressionExtensionAttribute.cs&lt;/b&gt; files ready, its time to compile them and convert them into a library. If you use VS.NET then you need to &lt;i&gt;Add Reference&lt;/i&gt; to the &lt;i&gt;System.Web.Services&lt;/i&gt;, &lt;i&gt;System.Xml&lt;/i&gt; and &lt;i&gt;SharpZipLib&lt;/i&gt; assemblies and compile the project. If you are manually compiling the files, then following compilation string:&lt;br /&gt;&lt;b&gt;csc /t:library /out:CompressionExtension.dll /r:SharpZipLib.dll CompressionExtension.cs CompressionExtensionAttribute.cs&lt;/b&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;This will produce the &lt;b&gt;CompressionExtension.dll&lt;/b&gt; library. Now you can use this library in your clients and Web Services to enable compression extension. Note: Remember the clients and servers will also need to install the &lt;i&gt;SharpZibLib.dll&lt;/i&gt; library also for this extension to work!&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;b&gt;Sample Web Service&lt;/b&gt;&lt;br /&gt;Our Compression Extension is ready for usage. I will create a simple Web Service which will demonstrate the usage of the Compression Extension, note the goal here is show the usage of the Compression Extension and not to teach how to create and deploy Web Services. If you want to learn more about Web Service basics please read &lt;a target="_blank" href="http://www.mastercsharp.com/article.aspx?ArticleID=52&amp;amp;&amp;amp;TopicID=7"&gt;this article&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p align="left"&gt;I am using the &lt;b&gt;Pubs&lt;/b&gt; sample database which installs with &lt;i&gt;MSDE 2000 (SQL Server)&lt;/i&gt;, just because I want to return a lot of data for testing purpose. But the Compression Extension is in no way tied to the database, it can be applied on any Web Method. As a matter of fact the Compression Extension does not even dictate there method parameter and&amp;nbsp; return parameter data type. Hence you can apply this extension on any Web Method no matter what parameters / return types it uses. &lt;br /&gt;In the listing below, I have defined a basic Web Service that returns a string containing the XML representation of the &lt;b&gt;Authors&lt;/b&gt;, &lt;b&gt;Titles&lt;/b&gt; and &lt;b&gt;Publishers&lt;/b&gt; tables from the &lt;b&gt;Pubs&lt;/b&gt; database. &lt;br /&gt;There are only two changes; Firstly, I have referenced the &lt;b&gt;MasterCSharp.WebServices&lt;/b&gt; namespace that contains the Compression Extension. Secondly, I have applied the Compression Extension on the &lt;b&gt;GetDetails&lt;/b&gt; Web Method. That's all you&amp;nbsp; need to do!!! It just can't get any simpler than this :). &lt;br /&gt;While deploying the Web Service, you should ensure the &lt;i&gt;SharpZipLib&lt;/i&gt; assembly has been registered in the GAC, alternatively you can also copy the library into the &lt;b&gt;BIN&lt;/b&gt; directory of the &lt;i&gt;Virtual Directory&lt;/i&gt; hosting this Web Service. Also don't forget to copy the &lt;b&gt;CompressionExtension.dll&lt;/b&gt; library into &lt;b&gt;BIN&lt;/b&gt; directory of the Virtual Root hosting this Web Service.&lt;/p&gt;&#xD;
&lt;p align="left"&gt;One important point to be noted is that we have applied a SOAP Extension, and this SOAP Extension is called only when a &lt;i&gt;SOAP call&lt;/i&gt; is made to a Web Method. Hence if we are making HTTP GET / POST calls the Compression Extension is NOT in effect. Hence when we check the Web Service in Internet Explorer using the ASP.NET rendered test interface, you cannot see any compressed output.&lt;/p&gt;&#xD;
&lt;table cellpadding="0" border="1" style="width: 100%;"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="100%"&gt;&#xD;
&lt;div onclick="cnblogs_code_show('3711f69e-10ae-4916-b23b-396d63907370')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div  id="cnblogs_code_open_3711f69e-10ae-4916-b23b-396d63907370"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: #000000;"&gt;@ WebService &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;PubsService&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Services;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; MasterCSharp.WebServices ;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data ;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Data.SqlClient ;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; PubsService {&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;  [WebMethod]&lt;br /&gt;&lt;br /&gt;  [CompressionExtension]&lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetDetails() {&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Replace with the connection string to connect to your database&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    SqlConnection myCon &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SqlConnection(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;server=(local)\\NetSDK;database=pubs;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; ;&lt;br /&gt;&lt;br /&gt;                               &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;Trusted_Connection&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;yes&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;);&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    SqlDataAdapter myCommand1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SqlDataAdapter(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SELECT * FROM Authors&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, myCon);&lt;br /&gt;&lt;br /&gt;    SqlDataAdapter myCommand2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SqlDataAdapter(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SELECT * FROM Titles&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, myCon);&lt;br /&gt;&lt;br /&gt;    SqlDataAdapter myCommand3 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; SqlDataAdapter(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;SELECT * FROM Publishers&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, myCon);&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    DataSet ds &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DataSet();&lt;br /&gt;&lt;br /&gt;    myCommand1.Fill(ds, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Authors&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;    myCommand2.Fill(ds, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Titles&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;    myCommand3.Fill(ds, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Publishers&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; ds.GetXml() ;&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p align="left"&gt;&lt;b&gt;Test Web Service Client&lt;/b&gt;&lt;br /&gt;In order to consume our &lt;i&gt;PubsService&lt;/i&gt; I create a console based test client. In VS.NET you can create a new &lt;i&gt;Console Project&lt;/i&gt; and then &lt;i&gt;Add Web Reference&lt;/i&gt; to the &lt;i&gt;PubsService&lt;/i&gt; and &lt;i&gt;Add Reference&lt;/i&gt; to the &lt;i&gt;CompressionExtension.dll&lt;/i&gt; library. Remember even method parameters sent from the client are compressed, hence you need to reference the Compression Extension library even at the client side.&lt;br /&gt;In case of manual class creation, use the &lt;b&gt;WSDL&lt;/b&gt; tool to generate a Proxy Class for the PubsService (replace the URL to the Web Service as per your setup): &lt;br /&gt;&lt;b&gt;wsdl http://localhost/PubsService/PubsService.asmx?WSDL&lt;/b&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;This creates a &lt;i&gt;PubsService.cs&lt;/i&gt; Proxy Class file. Now let's create the Pubs Test Application using this proxy class. The listing below shows the code for the &lt;i&gt;PubsTestApp&lt;/i&gt;. In this test application, I just make an instance of the Proxy class and call a Web Method. The value returned by the Web Service is saved to a file (so I can measure the bytes returned) and also printed on the console screen. Compile this application using the following compilation string: &lt;br /&gt;&lt;b&gt;csc /out:PubsTestApp.exe PubsService.cs PubsTestApp.cs&lt;/b&gt;&lt;/p&gt;&#xD;
&lt;table cellpadding="0" border="1" style="width: 100%;"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="100%"&gt;&#xD;
&lt;div onclick="cnblogs_code_show('5df9d3e9-f37f-4997-bdc7-10a91223bb36')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div  id="cnblogs_code_open_5df9d3e9-f37f-4997-bdc7-10a91223bb36"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO ;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; PubsTestApp&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Main()&lt;br /&gt;&lt;br /&gt;  {&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Create an instance of the Proxy Class&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    PubsService pws &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; PubsService();&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Open a StreamReader to a local file&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; This file will be used to log the return value&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; of the SOAP call&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    StreamWriter sw &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StreamWriter( &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;log.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Call the Web Method and write the return value to file&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    sw.Write( pws.GetDetails() ) ;&lt;br /&gt;&lt;br /&gt;    sw.Close();&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Call the Web Method again and write value to Console&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Console.WriteLine( pws.GetDetails() ) ;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;    Console.WriteLine();&lt;br /&gt;&lt;br /&gt;    Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hit Enter to Close Window!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;    Console.ReadLine();&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p align="left"&gt;Once the application is compiled we call the&lt;i&gt; PubsTestApp&lt;/i&gt;, it runs and shows some garbage characters, this output is even saved to the &lt;b&gt;log.txt&lt;/b&gt; file. In reality what's shown is not garbage, but its the Base 64 encoding of the zipped data. Open &lt;i&gt;Windows Explorer&lt;/i&gt; and observe the file size of the file log.txt, its approximately 4,864 bytes on my computer. This is the compressed data that's been sent to the client.&lt;/p&gt;&#xD;
&lt;p align="left"&gt;Next, you need to apply the the Compression Extension to the Proxy Class, so that you can receive normal output (unzipped data) from the Web Service. This is the step you would normally be taking right after generating the Proxy Class. Open the &lt;i&gt;PubsService.cs&lt;/i&gt; proxy class file and add the &lt;b&gt;[CompressionExtension]&lt;/b&gt; attribute above the &lt;b&gt;public string GetDetails()&lt;/b&gt; method definition. Also reference the &lt;b&gt;MasterCSharp.WebServices&lt;/b&gt; namespace which contains the Compression Extension. Once you apply the attribute, re-compile the &lt;i&gt;PubsTestApp&lt;/i&gt; this time using the following compilation string:&amp;nbsp; &lt;br /&gt;&lt;b&gt;csc /out:PubsTestApp.exe /r:CompressionExtension.dll PubsService.cs PubsTestApp.cs&lt;/b&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;Note: The &lt;i&gt;CompressionExtension.dll&lt;/i&gt; library should be in the same directory we are compiling the application and the &lt;i&gt;SharpZipLib.dll&lt;/i&gt; library should also be appropriately installed on the client.&lt;/p&gt;&#xD;
&lt;p align="left"&gt;Now run the PubsTestApp again, this time correct XML output is shown on the console screen, indicating the extension works on both ends seamlessly. Observe the size of the &lt;i&gt;log.txt&lt;/i&gt; file again and this time its around 15,908 bytes, this is the amount of data that would have been passed if we did not use compression. Hence the Compression Extension has achieved almost &lt;i&gt;30%&lt;/i&gt; size reduction in the SOAP Messages used to communicate between the client and the server. Although, this compression ratio will vary on compression algorithm and the type of data you are compressing.&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;This article provides a practical SOAP Extension that can be used in any kind of Web Services, to utilize network resources better. In this article I not only highlighted the creation and deployment of a SOAP Extension in .NET, but I also silently displayed how to pass binary data using Web Service i.e. using Base 64 Encoding. If you are wondering if this method would still let your Web Service interop with other platforms and programming languages, well I haven't worked with other toolkits, but I am sure, they would definitely allow you to manipulate the SOAP Message. And since we are using standard ZIP algorithms, I don't see a huge barrier to the usage of this Web Service across different platforms and programming languages. If some of you get a chance to test this, please do let me know!!&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/heros/aggbug/1681264.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/heros/archive/2010/03/09/1681264.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
