﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-前端工程师-Becket-随笔分类-C#</title><link>http://www.blogjava.net/ebecket/category/40886.html</link><description>一路风景我一路走着,不管多么疲惫,因为一路的风景很美.......
</description><language>zh-cn</language><lastBuildDate>Wed, 31 Mar 2010 10:27:30 GMT</lastBuildDate><pubDate>Wed, 31 Mar 2010 10:27:30 GMT</pubDate><ttl>60</ttl><item><title>javascript 放大镜v1.0 </title><link>http://www.blogjava.net/ebecket/archive/2010/03/31/317008.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Wed, 31 Mar 2010 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/31/317008.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/317008.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/31/317008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/317008.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/317008.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: javascript 放大镜v1.0 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;1&nbsp;放大倍数设置&nbsp;2&nbsp;透明度设置&nbsp;3&nbsp;反转特效&nbsp;4&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/ebecket/archive/2010/03/31/317008.html'>阅读全文</a><img src ="http://www.blogjava.net/ebecket/aggbug/317008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-31 09:23 <a href="http://www.blogjava.net/ebecket/archive/2010/03/31/317008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2010 .NET面试题整理之基础篇</title><link>http://www.blogjava.net/ebecket/archive/2010/03/31/317005.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Wed, 31 Mar 2010 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/31/317005.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/317005.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/31/317005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/317005.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/317005.html</trackback:ping><description><![CDATA[<h1 class="postTitle"><a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/fengyao/archive/2010/03/31/1700853.html">2010 .NET面试题整理之基础篇</a> </h1>
<div class="postBody"><span style="color: #000000">
<h2 class="brush:html"><span style="color: #ff0000; font-size: 10pt">开</span><span style="color: #ff0000; font-size: 10pt">篇语：</span><span style="color: #0000ff; font-size: 10pt">对于已有工作经验的朋友，也许面试题已显得不怎么重要，但是如果你应聘的还仅仅是个普通的程序员，相信在很多的公司都还是会先拿出一套面试题，可能对整个面试影响不大，但做好面试题无疑会赢得第一个好的印象，特别对于那些缺少项目经验的应届毕业生。很多时候，在看这些面试题的时候，是否有感过曾经那些一个个不起眼的小程序题所针对的问题正是自己在项目中所犯的错误？是否会发现，原来还有这么多东西自己都还从未去想过？趁自己这次重新找工作之际，对常见面试题进行进行一次重新整理，与大家共同学习！本贴将会进行不断完善和继续更新，有些答案可能并不完全正确，希望能得到大家的指正。</span></h2>
<h2 class="brush:html"><span style="color: #800000; font-size: 10pt">接下来还将整理出：数据库篇、算法篇、设计模式篇</span></span></h2>
<p class="brush:html">&nbsp;</p>
<p><span style="font-size: 10pt"><strong>1、什么是面向对象</strong></span></p>
<p><span style="font-size: 10pt">面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP；</span><br />
<span style="font-size: 10pt">通俗的解释就是万物皆对象，把所有的事物都看作一个个可以独立的对象(单元)，它们可以自己完成自己的功能，而不是像C那样分成一个个函数；</span><br />
<span style="font-size: 10pt">现在纯正的OO语言主要是java和C#，C++也支持OO，C是面向过程的。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>2、简述 private、 protected、 public、 internal 修饰符的访问权限。</strong> </span></p>
<p><span style="font-size: 10pt">private : 私有成员, 在类的内部才可以访问。<br />
protected : 保护成员，该类内部和继承类中可以访问。<br />
public : 公共成员，完全公开，没有访问限制。 <br />
internal: 当前程序集内可以访问。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>3、ADO.NET中的五个主要对象</strong></span></p>
<p><span style="color: #800000; font-size: 10pt">Connection：</span><span style="font-size: 10pt">主要是开启程序和数据库之间的连结。没有利用连结对象将数据库打开，是无法从数据库中取得数据的。这个物件在ADO.NET 的最底层，我们可以自己产生这个对象，或是由其它的对象自动产生。<br />
</span><span style="color: #800000; font-size: 10pt">Command：</span><span style="font-size: 10pt">主要可以用来对数据库发出一些指令，例如可以对数据库下达查询、新增、修改、删除数据等指令，以及呼叫存在数据库中的预存程序等。这个对象是架构在Connection 对象上，也就是Command 对象是透过连结到数据源。<br />
</span><span style="color: #800000; font-size: 10pt">DataAdapter：</span><span style="font-size: 10pt">主要是在数据源以及DataSet 之间执行数据传输的工作，它可以透过Command 对象下达命令后，并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上，并提供了许多配合DataSet 使用的功能。<br />
</span><span style="color: #800000; font-size: 10pt">DataSet：</span><span style="font-size: 10pt">这个对象可以视为一个暂存区（Cache），可以把从数据库中所查询到的数据保留起来，甚至可以将整个数据库显示出来。DataSet 的能力不只是可以储存多个Table 而已，还可以透过DataAdapter对象取得一些例如主键等的数据表结构，并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象，这个对象架构在DataAdapter对象上，本身不具备和数据源沟通的能力；也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。<br />
</span><span style="color: #800000; font-size: 10pt">DataReader：</span><span style="font-size: 10pt">当我们只需要循序的读取数据而不需要其它操作时，可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据，而且这些数据是只读的，并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔，而且只能只读，所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外，因为不用把数据全部传回，故可以降低网络的负载。<br />
</span><span style="font-size: 10pt">ADO.NET 使用Connection 对象来连接数据库，使用Command 或DataAdapter对象来执行SQL语句，并将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 对象操作数据结果。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>4、列举ASP.NET 页面之间传递值的几种方式。</strong> </span></p>
<p><span style="font-size: 10pt">1.使用QueryString, 如....?id=1; response. Redirect().... <br />
2.使用Session变量 <br />
3.使用Server.Transfer<br />
4.Cookie传值<br />
5.Application传值</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>5、C#中的委托是什么？事件是不是一种委托？</strong></span></p>
<p><span style="font-size: 10pt">委托可以把一个方法作为参数代入另一个方法。<br />
委托可以理解为指向一个函数的引用。<br />
是，是一种特殊的委托。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>6、override与重载的区别</strong> </span></p>
<p><span style="font-size: 10pt">重载是方法的名称相同。参数或参数类型不同，进行多次重载以适应不同的需要 <br />
Override 是进行基类中函数的重写。为了适应需要。</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 10pt">7、描述一下C#中索引器的实现过程，是否只能根据数字进行索引？</span></strong></p>
<p><strong></strong><span style="font-size: 10pt">不是。可以用任意类型。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>8、三层架构通</strong></span></p>
<p><span style="font-size: 10pt">常意义上的三层架构就是将整个业务应用划分为：表现层（UI）、业务逻辑层（BLL）、数据访问层（DAL）。<br />
区分层次的目的即为了&#8220;高内聚，低耦合&#8221;的思想。<br />
</span><span style="color: #800000; font-size: 10pt">表现层（UI）：</span><span style="font-size: 10pt">通俗讲就是展现给用户的界面，即用户在使用一个系统的时候的所见所得。<br />
</span><span style="color: #800000; font-size: 10pt">业务逻辑层（BLL）：</span><span style="font-size: 10pt">针对具体问题的操作，也可以说是对数据层的操作，对数据业务逻辑处理。<br />
</span><span style="color: #800000; font-size: 10pt">数据访问层（DAL）：</span><span style="font-size: 10pt">该层所做事务直接操作数据库，针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。<br />
三层结构是N层结构的一种，一般来说，层次之间是向下依赖的，下层代码未确定其接口（契约）前，上层代码是无法开发的，下层代码接口（契约）的变化将使上层的代码一起变化。<br />
</span><span style="color: #800000; font-size: 10pt">优点：</span><span style="font-size: 10pt"> 分工明确，条理清晰，易于调试，而且具有可扩展性。 <br />
</span><span style="color: #800000; font-size: 10pt">缺点：</span><span style="font-size: 10pt"> 增加成本。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>9、MVC模式</strong> </span></p>
<p><span style="font-size: 10pt">MVC(Model View Controller)模型－视图－控制器<br />
MVC是典型的平行关系，没有说谁在上谁在下的关系，模型负责业务领域的事情，视图负责显示的事情，控制器把数据读取出来填充模型后把模型交给视图去处理。而各种验证什么的应该是在模型里处理了。它强制性的使应用程序的输入、处理和输出分开。MVC最大的好处是将逻辑和页面分离。 </span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>10、什么是装箱和拆箱？</strong> </span></p>
<p><span style="font-size: 10pt">装箱：从值类型接口转换到引用类型。<br />
拆箱：从引用类型转换到值类型。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>11、什么叫应用程序域</strong></span></p>
<p><span style="font-size: 10pt">一种边界，它由公共语言运行库围绕同一应用程序范围内创建的对象建立（即，从应用程序入口点开始，沿着对象激活的序列的任何位置）。<br />
应用程序域有助于将在一个应用程序中创建的对象与在其他应用程序中创建的对象隔离，以使运行时行为可以预知。<br />
在一个单独的进程中可以存在多个应用程序域。应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>12、CTS、CLS、CLR分别作何解释</strong> </span></p>
<p><span style="font-size: 10pt">CTS：Common Type System 通用系统类型。<br />
</span><span style="font-size: 10pt">CLS：Common Language Specification 通用语言规范。</span><br />
<span style="font-size: 10pt">CLR：Common Language Runtime 公共语言运行库。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>13、在dotnet中类(class)与结构(struct)的异同？</strong></span></p>
<p><span style="font-size: 10pt">Class可以被实例化,属于引用类型,是分配在内存的堆上的<br />
Struct属于值类型,是分配在内存的栈上的。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>14、堆和栈的区别？</strong></span></p>
<p><span style="font-size: 10pt">栈是编译期间就分配好的内存空间，因此你的代码中必须就栈的大小有明确的定义；<br />
堆是程序运行期间动态分配的内存空间，你可以根据程序的运行情况确定要分配的堆内存的大小。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>15、能用foreach遍历访问的对象的要求</strong></span></p>
<p><span style="font-size: 10pt">需要实现IEnumerable接口或声明GetEnumerator方法的类型。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>16、GC是什么? 为什么要有GC?</strong>&nbsp; </span></p>
<p><span style="font-size: 10pt">GC是垃圾收集器。程序员不用担心内存管理，因为垃圾收集器会自动进行管理。<br />
要请求垃圾收集，可以调用下面的方法之一： System.gc()&nbsp; Runtime.getRuntime().gc() </span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>17、String s = new String("xyz");创建了几个String Object?</strong> </span></p>
<p><span style="font-size: 10pt">两个对象，一个是&#8220;xyx&#8221;,一个是指向&#8220;xyx&#8221;的引用对象。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>18、值类型和引用类型的区别？</strong></span></p>
<p><span style="font-size: 10pt">1.赋值方式不同：基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时，将复制包含的值。引用类型变量的赋值只复制对对象的引用，而不复制对象本身。<br />
</span><span style="font-size: 10pt">2.值类型不可能派生出新的类型：所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是，结构也可以实现接口。<br />
3.值类型不可能包含 null 值：然而，可空类型功能允许将 null 赋给值类型。 <br />
4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。&nbsp; </span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>19、C#中的接口和类有什么异同。</strong> </span></p>
<p><span style="color: #800000; font-size: 10pt">不同点：</span><span style="font-size: 10pt"><br />
不能直接实例化接口。<br />
接口不包含方法的实现。<br />
接口可以多继承，类只能单继承。<br />
类定义可在不同的源文件之间进行拆分。<br />
</span><span style="color: #800000; font-size: 10pt">相同点：</span><span style="font-size: 10pt"><br />
接口、类和结构都可以从多个接口继承。<br />
接口类似于抽象基类：继承接口的任何非抽象类型都必须实现接口的所有成员。<br />
接口和类都可以包含事件、索引器、方法和属性。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>20、abstract class和interface有什么区别?</strong> </span></p>
<p><span style="color: #800000; font-size: 10pt">相同点： </span><span style="font-size: 10pt"><br />
都不能被直接实例化，都可以通过继承实现其抽象方法。 <br />
都是面向抽象编程的技术基础，实现了诸多的设计模式。<br />
</span><span style="color: #800000; font-size: 10pt">不同点： </span><span style="font-size: 10pt"><br />
接口支持多继承；抽象类不能实现多继承。 <br />
接口只能定义抽象规则；抽象类既可以定义规则，还可能提供已实现的成员。 <br />
接口是一组行为规范；抽象类是一个不完全的类，着重族的概念。 <br />
接口可以用于支持回调（CallBack）；抽象类不能实现回调，因为继承不支持。 <br />
接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名，但不能定义字段和包含实现的方法；<br />
抽象类可以定义字段、属性、包含有实现的方法。&nbsp; <br />
接口可以作用于值类型(Struct)和引用类型(Class)；抽象类只能作用于引用类型。例如，Struct就可以继承接口，而不能继承类。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>21、sleep() 和 wait() 有什么区别?</strong> </span></p>
<p><span style="font-size: 10pt">sleep()方法是将当前线程挂起指定的时间。<br />
wait()释放对象上的锁并阻塞当前线程，直到它重新获取该锁。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>22、是否可以继承String类?</strong> </span></p>
<p><span style="font-size: 10pt">String类是final类故不可以继承。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>23、try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后?</strong> </span></p>
<p><span style="font-size: 10pt">会执行，在return前执行。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>24、new 关键字用法</strong></span></p>
<p><span style="font-size: 10pt">new 运算符 用于创建对象和调用构造函数。<br />
</span><span style="font-size: 10pt">new 修饰符 用于向基类成员隐藏继承成员。<br />
</span><span style="font-size: 10pt">new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。<br />
</span><span style="font-size: 10pt">new实现多态</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>25、如何把一个Array复制到ArrayList里</strong></span></p>
<p><span style="font-size: 10pt">实现1 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(); list.AddRange(s);<br />
</span><span style="font-size: 10pt">实现2 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(s);</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 10pt">26、DataGrid的Datasouse可以连接什么数据源</span></strong></p>
<p><strong></strong><span style="font-size: 10pt">DataTable<br />
</span><span style="font-size: 10pt">DataView<br />
</span><span style="font-size: 10pt">DataSet<br />
</span><span style="font-size: 10pt">DataViewManager<br />
</span><span style="font-size: 10pt">任何实现IListSource接口的组件<br />
</span><span style="font-size: 10pt">任何实现IList接口的组件</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>27、描述线程与进程的区别？</strong></span></p>
<p><span style="font-size: 10pt">1.线程(Thread)与进程（Process）二者都定义了某种边界，不同的是进程定义的是应用程序与应用程序之间的边界，</span><span style="font-size: 10pt">不同的进程之间不能共享代码和数据空间，而线程定义的是代码执行堆栈和执行上下文的边界。<br />
</span><span style="font-size: 10pt">2.一个进程可以包括若干个线程，同时创建多个线程来完成某项任务，便是多线程。而同一进程中的不同线程共享代码和数据空间。</span><span style="font-size: 10pt">用一个比喻来说，如果一个家庭代表一个进程，在家庭内部，各个成员就是线程，家庭中的每个成员都有义务对家庭的财富进行积累，</span><span style="font-size: 10pt">同时也有权利对家庭财富进行消费，当面对一个任务的时候，家庭也可以派出几个成员来协同完成，而家庭之外的人则没有办法直接消费不属于自己家庭的财产。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>28、什么是强类型，什么是弱类型？哪种更好些？为什么?</strong> </span></p>
<p><span style="font-size: 10pt">强类型是在编译的时候就确定类型的数据，在执行时类型不能更改，而弱类型在执行的时候才会确定类型。<br />
</span><span style="font-size: 10pt">没有好不好，二者各有好处，强类型安全，因为它事先已经确定好了，而且效率高。<br />
</span><span style="font-size: 10pt">一般用于编译型编程语言，如c++,java,c#,pascal等,弱类型相比而言不安全，在运行的时候容易出现错误，但它灵活，多用于解释型编程语言，如javascript,vb等 </span></p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 10pt">29、什么是反射? </span></strong></p>
<p><span style="font-size: 10pt">程序集包含模块，而模块又包括类型，类型下有成员，反射就是管理程序集，模块，类型的对象，它能够动态的创建类型的实例，设置现有对象的类型或者获取现有对象的类型，能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例 </span></p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 10pt">30、DateTime是否可以为null?</span></strong></p>
<p><span style="font-size: 10pt">不能，因为其为Struct类型，而结构属于值类型，值类型不能为null,只有引用类型才能被赋值null</span></p>
<p><br />
<span style="font-size: 10pt"><strong>31、using() 语法有用吗？什么是IDisposable？它是如何实现确定性终结的</strong></span></p>
<p><span style="font-size: 10pt">有用，实现了IDisposiable的类在using中创建，using结束后会自定调用该对象的Dispose方法，释放资源。不明白什么是确定性终结</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 10pt">32、Assembly.Load("foo.dll"); 这句话是否正确？</span></strong></p>
<p><strong></strong><span style="font-size: 10pt">错误，正确的应该是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll");</span></p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 10pt">33、Session有什么重大BUG，微软提出了什么方法加以解决？</span></strong></p>
<p><strong></strong><span style="font-size: 10pt">是iis中由于有进程回收机制，系统繁忙的话Session会丢失，可以用Sate server或SQL Server数据库的方式存储Session，不过这种方式比较慢，而且无法捕获Session的END事件。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>34、XML 与 HTML 的主要区别</strong></span></p>
<p><span style="font-size: 10pt">1. XML是区分大小写字母的，HTML不区分。 <br />
</span><span style="font-size: 10pt">2. 在HTML中，如果上下文清楚地显示出段落或者列表键在何处结尾，那么你可以省略&lt;/p&gt;或者&lt;/li&gt;之类的结束 标记。在XML中，绝对不能省略掉结束标记。 <br />
</span><span style="font-size: 10pt">3. 在XML中，拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。 </span><br />
<span style="font-size: 10pt">4. 在XML中，属性值必须分装在引号中。在HTML中，引号是可用可不用的。 </span><br />
<span style="font-size: 10pt">5. 在HTML中，可以拥有不带值的属性名。在XML中，所有的属性都必须带有相应的值。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>35、重载与覆盖的区别？</strong></span></p>
<p><span style="font-size: 10pt">1.方法的覆盖是子类和父类之间的关系，是垂直关系；方法的重载是同一个类中方法之间的关系，是水平关系</span><br />
<span style="font-size: 10pt">2.覆盖只能由一个方法，或只能由一对方法产生关系；方法的重载是多个方法之间的关系。</span><br />
<span style="font-size: 10pt">3.覆盖要求参数列表相同；重载要求参数列表不同。</span><br />
<span style="font-size: 10pt">4.覆盖关系中，调用那个方法体，是根据对象的类型（对像对应存储空间类型）来决定；重载关系，是根据调 用时的实参表与形参表来选择方法体的。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 10pt"><strong>36、请编程遍历页面上所有TextBox控件并给它赋值为string.Empty？</strong></span></p>
<h2 class="brush:html"><strong><span style="font-family: 宋体; font-size: 10pt; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 11.0pt">
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(System.Windows.Forms.Control&nbsp;control&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.Controls)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(control&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;System.Windows.Forms.TextBox)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Windows.Forms.TextBox&nbsp;tb&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(System.Windows.Forms.TextBox)control;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tb.Text&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;String.Empty;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
</strong></div>
</span></h2>
<h2 style="margin: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="Cambria"></font></span></font>&nbsp;</h2>
<h2 style="margin: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="Cambria"><span style="font-size: 10pt">37</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-theme-font: major-fareast; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; mso-fareast-font-family: 宋体">、根据线程安全的相关知识，分析以下代码，当调用</span><span lang="EN-US"><font face="Cambria"><span style="font-size: 10pt">test</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-theme-font: major-fareast; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; mso-fareast-font-family: 宋体">方法时</span><span lang="EN-US"><font face="Cambria"><span style="font-size: 10pt">i&gt;10</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-theme-font: major-fareast; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; mso-fareast-font-family: 宋体">时是否会引起死锁</span><span lang="EN-US"><font face="Cambria"><span style="font-size: 10pt">?</span></font></span><span style="font-family: 宋体; font-size: 10pt; mso-fareast-theme-font: major-fareast; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; mso-fareast-font-family: 宋体">并说明理由。</span></font></h2>
<h2 style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体; font-size: 10pt; mso-fareast-theme-font: major-fareast; mso-ascii-font-family: Cambria; mso-hansi-font-family: Cambria; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; mso-fareast-font-family: 宋体">
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;test(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">lock</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">10</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000">--</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
</span></font></div>
</h2>
<p><span style="font-size: 10pt">不会发生死锁，（但有一点int是按值传递的，所以每次改变的都只是一个副本，因此不会出现死锁。但如果把int换做一个object，那么死锁会发生）</span></p>
<p>&nbsp;<br />
<strong><span style="font-size: 10pt">38</span><span style="font-family: 宋体; font-size: 10pt">、写出程序的输出结果</span></strong></p>
<div class="cnblogs_code" onclick="cnblogs_code_show('0c12e53a-6df4-4699-9929-23fe22816866')"><img id="code_img_closed_0c12e53a-6df4-4699-9929-23fe22816866" class="code_img_closed" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img style="display: none" id="code_img_opened_0c12e53a-6df4-4699-9929-23fe22816866" class="code_img_opened" onclick="cnblogs_code_hide('0c12e53a-6df4-4699-9929-23fe22816866',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><span class="cnblogs_code_collapse">程序代码</span>
<div id="cnblogs_code_open_0c12e53a-6df4-4699-9929-23fe22816866" class="cnblogs_code_hide">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Class1<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Class1.str</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;StringConvert(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;str)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">string&nbsp;being&nbsp;converted.</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;StringConvert(Class1&nbsp;c)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">string&nbsp;being&nbsp;converted.</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Add(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddWithRef(</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">10</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">20</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">str</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class1&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Class1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Add(i1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddWithRef(</span><span style="color: #0000ff">ref</span><span style="color: #000000">&nbsp;i2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Add(c.i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringConvert(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringConvert(c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(i1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(i2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(c.i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(c.str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</div>
</div>
<p>&nbsp;<img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/fengyao/SpxImage.jpg" width="458" height="117" />&nbsp;</p>
<p><strong><span style="font-size: 10pt"><br />
39</span><span style="font-family: 宋体; font-size: 10pt">、写出程序的输出结果</span></strong></p>
<p><strong><span style="font-family: 宋体; font-size: 10pt"></p>
<div class="cnblogs_code" onclick="cnblogs_code_show('b2825ff6-488f-428f-8581-6dc052bf4518')"><img id="code_img_closed_b2825ff6-488f-428f-8581-6dc052bf4518" class="code_img_closed" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img style="display: none" id="code_img_opened_b2825ff6-488f-428f-8581-6dc052bf4518" class="code_img_opened" onclick="cnblogs_code_hide('b2825ff6-488f-428f-8581-6dc052bf4518',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><span class="cnblogs_code_collapse">程序代码</span>
<div id="cnblogs_code_open_b2825ff6-488f-428f-8581-6dc052bf4518" class="cnblogs_code_hide">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;A()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">'</span><span style="color: #800000">A</span><span style="color: #800000">'</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Fun()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">A.Fun()</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;B&nbsp;:&nbsp;A<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;B()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">'</span><span style="color: #800000">B</span><span style="color: #800000">'</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Fun()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">B.Fun()</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;B();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.Fun();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</div>
</div>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/fengyao/2.jpg" width="456" height="83" /></p>
<font size="2"><strong>
<p><br />
40<span style="font-family: 宋体; font-size: 10pt">、写出程序的输出结果</span></p>
<p><span style="font-family: 宋体; font-size: 10pt"></p>
<div class="cnblogs_code" onclick="cnblogs_code_show('332566a9-77d0-4d8e-ac3b-e8c5e8015907')"><img style="display: inline" id="code_img_closed_332566a9-77d0-4d8e-ac3b-e8c5e8015907" class="code_img_closed" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" jquery1269997242343="6" /><img style="display: none" id="code_img_opened_332566a9-77d0-4d8e-ac3b-e8c5e8015907" class="code_img_opened" onclick="cnblogs_code_hide('332566a9-77d0-4d8e-ac3b-e8c5e8015907',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" jquery1269997242343="5"  alt="" /><span class="cnblogs_code_collapse">程序代码</span>
<div style="display: none" id="cnblogs_code_open_332566a9-77d0-4d8e-ac3b-e8c5e8015907" class="cnblogs_code_hide" jquery1269997242343="3">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Fun1(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Fun2(A&nbsp;a)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.Fun1(</span><span style="color: #800080">1</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fun1(</span><span style="color: #800080">5</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;B&nbsp;:&nbsp;A<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Fun1(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.Fun1(i&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;B();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;A();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.Fun2(b);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.Fun2(a);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</div>
</div>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/fengyao/3.JPG" width="416" height="92" /></span></strong></font></span></strong></p>
</div>
<br />
<br />
转自 http://www.cnblogs.com/fengyao/archive/2010/03/31/1700853.html
<img src ="http://www.blogjava.net/ebecket/aggbug/317005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-31 09:19 <a href="http://www.blogjava.net/ebecket/archive/2010/03/31/317005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlhelper使用指南</title><link>http://www.blogjava.net/ebecket/archive/2010/03/26/316614.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Fri, 26 Mar 2010 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/26/316614.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316614.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/26/316614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316614.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316614.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: sqlhelper使用指南 摘要：Data Access Application Block 是一个 .NET 组件，包含优化的数据访问代码，可以帮助用户调用存储过程以及向 SQL Server 数据库发出 SQL 文本命令。它返回 SqlDataReader、DataSet 和 XmlReader 对象。您可以在自己的 .NET 应用程序中将其作为构造块来使用，以减少需要创建、测试和维护...&nbsp;&nbsp;<a href='http://www.blogjava.net/ebecket/archive/2010/03/26/316614.html'>阅读全文</a><img src ="http://www.blogjava.net/ebecket/aggbug/316614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-26 09:04 <a href="http://www.blogjava.net/ebecket/archive/2010/03/26/316614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web 调试代理软件Fiddler 一个http调试代理，能够记录所有的你电脑和互联网之间的http通讯</title><link>http://www.blogjava.net/ebecket/archive/2010/03/23/316237.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 23 Mar 2010 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/23/316237.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316237.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/23/316237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316237.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316237.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt">微软的Fiddler 包含一个简单却功能强大的基于JScript .NET 事件脚本子系统，他非常灵活性非常棒，可以支持众多的http调试任务。Fiddler 是用C#写出来的。它还是一个http调试代理，它能 够记录所有的你电脑和互联网之间的http通讯，Fiddler 可以也可以让你检查所有的http通讯，设置断点，以及Fiddle 所有的&#8220;进出&#8221;的数据（指cookie,html,js,css等文件，这些都可以让你胡乱修改的意思）。 Fiddler 要比其他的网络调试器要更加简单，因为它仅仅暴露http通讯还有提供一个用户友好的格式。<br />
<div class="spctrl"></div>
　　Fiddler 包含一个简单却功能强大的基于JScript .NET 事件脚本子系统，他非常灵活性非常棒，可以支持众多的http调试任务。Fiddler 是用C#写出来的。<br />
<div class="spctrl"></div>
　　Fiddler支持断点调试概念，当你在软件的菜单—rules—automatic breakpoints选项选择beforerequest,或者当这些请求或响应属性能够跟目标的标准相匹配，Fiddler就能够暂停Http通讯， 情切允许修改请求和响应。这种功能对于安全测试是非常有用的，当然也可以用来做一般的功能测试，因为所有的代码路径都可以用来演习。<br />
<div class="spctrl"></div>
　　用户可以加入一个Inspector插件对象，来使用.net下的任何语言来编写Fiddler扩展。RequestInspectors 和 ResponseInspectors提供一个格式规范的，或者是被指定的（用户自定义）Http请求和响应视图。<br />
<div class="spctrl"></div>
　　通过显示所有的Http通讯，Fiddler可以轻松的演示哪些用来生成一个页面，通过统计页面（就是Fiddler左边的那个大框）用户可以很轻松的使用多选，来得到一个WEB页面的&#8220;总重量&#8221;（页面文件以及相关js,css等）你也可以很轻松得看到你请求的某个页面，总共请求了多少次，以及多少字节被转化了。<br />
<div class="spctrl"></div>
<p>　　另外，通过暴露HTTP头，用户可以看见哪些页面被允许在客户端或者是代理端进行缓存。如果要是一个响应没有包含Cache-Control 头，那么他就不会被缓存在客户端。</p>
<p>Fiddler 是微软出品的一款 Web 调试代理软件，它记录您的电脑和 Internet 之间的 HTTP(S) 数据流。Fiddler 允许你查看所有的 HTTP(S) 数据流，并且可以设置断点，改变请求和回应的数据。</p>
<p>Fiddler 是一款免费软件，可以对来自任意浏览器的访问的调试。</p>
<div class="code">Fiddler 目前可以调试并解密 HTTPS 数据流。</div>
<p><span class="chapterTitle">下载 Fiddler</span></p>
<p>您可以在本站的<a href="http://www.cftea.com/tools/" target="_blank">工具</a>中下载 Fiddler2，也可以 <a href="http://www.fiddlertool.com/" target="_blank">www.fiddlertool.com</a> 或 <a href="http://www.fiddler2.com/" target="_blank">www.fiddler2.com</a> 进行下载。</p>
<p><span class="chapterTitle">安装 Fiddler</span></p>
<p>安装 Fiddler 比较简单，双击即可安装，安装完后可以在&#8220;开始&#8221;、&#8220;程序&#8221;中找到 Fiddler。</p>
<p><span class="chapterTitle">使用 Fiddler: 目前没有中文版，下面就 Fiddler 的使用作个介绍。</span></p>
<p>首先对主界面作一个介绍，请点击查看大图。</p>
<p align="center"><a href="http://www.cftea.com/c/2007/08/Y4QW6ZTWLPZPO5RE/UWZC5ZWEZ1M05Q25_b.htm" target="_blank"><img border="0" alt="Fiddler 主界面说明" src="http://www.cftea.com/c/2007/08/Y4QW6ZTWLPZPO5RE/UWZC5ZWEZ1M05Q25.jpg" /><br />
点击查看大图</a></p>
<p><span class="itemTitle">性能和数据监测</span></p>
<p>开启抓取后，我们访问一个网页，在左边列表框中就可以得到相应的会话列表。注意，这里访问网页<span class="caution">不能使用回送地址</span>，如：127.0.0.1 或 localhost，但可以利用本机的 IP 访问，如：192.168.0.1 等。</p>
<p>选中一个会话：</p>
<ul>
    <li>在 Performance Statistics 中可以看到数据在互联网上经过的路径。
    <li>在 Session Inspector 中可以看到会话请求（发送）和回应（接收）的数据，可以分各部分查看。 </li>
</ul>
<p><span class="itemTitle">自动响应</span></p>
<p>这里是使用用户自定义的一个文件来响应用户的请求，举例说明：</p>
<ul>
    <li>创建一个文本文件，存放于 C:\foo.txt。
    <li>在 AutoResponder 中选中 Enable automatic responses。
    <li>添加一个规则，设定一个 URI，响应一项填写：C:\foo.txt。
    <li>此时我们在浏览器中访问这个 URI 时，得到的就不是 URI 的内容，而是 C:\foo.txt 的内容。 </li>
</ul>
<p><span class="itemTitle">创建请求</span></p>
<p>切换到 Request Builder 标签，输入一个网址，在 Request Headers 中输入：</p>
<div class="code">User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; SailBrowser 2005; .NET CLR 2.0.50727)<br />
Referer: http://www.fiddlertool.com/</div>
<p>此时我们再打开 Web 日志（IIS 的日志通常位于 C:\WINDOWS\system32\Logfiles，某些情况下日志可能不会立即在文件中表现出来），可以看到：日志中记录的 IE 版本是 8.0，来源（在 ASP 中可以用 Request.ServerVariables("HTTP_REFERER") 获得该值）是 http://www.fiddlertool.com/。</p>
<p>&nbsp;</p>
<p>官方网站 http://www.fiddler2.com/</p>
<p><a title="IE下查看header的软件Fiddler" href="http://www.21andy.com/blog/upload/20080125/fiddler2setup_1201266686.exe" target="_blank">下载Fiddler</a><br />
--------------------------------------------------------------------------------</p>
<p>HTTP调试工具：Fiddler介绍一（翻译）(原文地址：http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwebgen/html/IE_IntroFiddler.asp)</p>
<p>这个工具我已经使用比较长时间了，对我的帮助也挺大，今天我翻译的微软的文章，让更多的朋友都来了解这个不错的工具，也是我第一次翻译文章，不恰当之处请大家大家多多指正。<br />
介绍：</p>
<p>你是不是曾经疑惑过你的web程序和IE是如何交互的？你是不是遇到过一些奇怪的而你又无法解决的性能瓶颈？你是不是对那些发送给服务器端的cookie 和那些你下载下来的被标记为可缓存的内容感到好奇？</p>
<p>Fiddler官方网站及下载地址：http://www.fiddlertool.com/Fiddler/dev/</p>
<p>微软的Fiddler能够帮助你回答以上的问题，不但如此，它还是一个http调试代理，它能 够记录所有的你电脑和互联网之间的http通讯，Fiddler 可以也可以让你检查所有的http通讯，设置断点，以及Fiddle 所有的&#8220;进出&#8221;的数据（指cookie,html,js,css等文件，这些都可以让你胡乱修改的意思）。 Fiddler 要比其他的网络调试器要更加简单，因为它仅仅暴露http通讯还有提供一个用户友好的格式。<br />
Fiddler 包含一个简单却功能强大的基于JScript .NET 事件脚本子系统，他非常灵活性非常棒，可以支持众多的http调试任务。Fiddler 是用C#写出来的。<br />
。。。。。接下来是一大段废话，关于如何安装的，只要一路next，就可以了。这段话我就跳过，直接切入正题了。</p>
<p>Running Fiddler</p>
<p>当你启动了Fiddler，程序将会把自己作为一个微软互联网服务的系统代理中去。你可以通过检查代理设置对话框来验证Fiddler是被正确地截取了web请求。操作是这样的：点击IE设置，工具，局域网设置，最后点击高级。<br />
<img border="0" hspace="10" alt="IE下查看header的软件Fiddler" vspace="10" align="center" src="http://www.21andy.com/blog/upload/20080125/12012666621.gif" /><br />
作为系统代理，所有的来自微软互联网服务（WinInet）的http请求再到达目标Web服务器的之前都会经过Fiddle，同样的，所有的Http响应都会在返回客户端之前流经Fiddler。这样，就能明白Fiddler很多作用了吧！<br />
<img border="0" hspace="10" alt="IE下查看header的软件Fiddler" vspace="10" align="center" src="http://www.21andy.com/blog/upload/20080125/12012666622.gif" /></p>
<p>当你关闭Fiddler的时候，它就会自动从系统注册表中移出，换句话说，当你关闭了Fiddler后，不会占着茅坑不拉屎。</p>
<p>下面，是一个Fillder的用户界面，大家可以参考参考其功能。<br />
<img border="0" hspace="10" alt="IE下查看header的软件Fiddler" vspace="10" align="center" src="http://www.21andy.com/blog/upload/20080125/12012666623.gif" /></p>
<h3>用Fiddler来做性能测试</h3>
<p><strong>HTTP统计视图</strong>通过显示所有的Http通讯，Fiddler可以轻松的演示哪些用来生成一个页面，通过统计页 面（就是Fiddler左边的那个大框）用户可以很轻松的使用多选，来得到一个WEB页面的&#8220;总重量&#8221;（页面文件以及相关js,css等）你也可以很轻松 得看到你请求的某个页面，总共请求了多少次，以及多少字节被转化了。<br />
<img border="0" hspace="10" alt="IE下查看header的软件Fiddler" vspace="10" align="center" src="http://www.21andy.com/blog/upload/20080125/12012666624.gif" /><br />
另外，通过暴露HTTP头，用户可以看见哪些页面被允许在客户端或者是代理端进行缓存。如果要是一个响应没有包含Cache-Control 头，那么他就不会被缓存在客户端。</p>
<p><img border="0" hspace="10" alt="IE下查看header的软件Fiddler" vspace="10" align="center" src="http://www.21andy.com/blog/upload/20080125/12012666625.gif" /></p>
<p>用Fiddler来调试</p>
<p>Fiddler支持断点调试概念，当你在软件的菜单—rules—automatic breakpoints选项选择beforerequest,或者当这些请求或响应属性能够跟目标的标准相匹配，Fiddler就能够暂停Http通讯， 情切允许修改请求和响应。这种功能对于安全测试是非常有用的，当然也可以用来做一般的功能测试，因为所有的代码路径都可以用来演习。<br />
<img border="0" hspace="10" alt="IE下查看header的软件Fiddler" vspace="10" align="center" src="http://www.21andy.com/blog/upload/20080125/12012666626.gif" /><br />
<strong>Session检查</strong>用户可以在BuilderPage项种来以手工的方式来创建一个HTTP请求（即在 Fiddler右侧的tab的第三个，RequestBUILDER），或者可以使用拖拽操作从Session列表中来移动一个已经存在的请求到 builder page 来再次执行这个请求。。。<br />
<strong>Fiddler 扩展</strong>Fiddler可以使用 .net framework来对它进行扩展。有2种为Fiddler扩展准备的基本机制：</p>
<p>自定义规则，和规则检查。</p>
<p><strong>使用脚本化的规则来扩展Fiddler</strong><br />
Fiddler支持JScript .NET引擎，它可以允许用户自动地修改Http请求和响应。这个引擎能够在可视化界面修改在FiddlerUI中的Session，可以从列表中提取你感兴趣的错误，也可以移除你不感兴趣的Session。</p>
<p>以下的示例代码演示当cookie被加载的时候把界面变成紫色。</p>
<pre>static function OnBeforeRequest(oSession:Fiddler.Session)</pre>
<pre>{</pre>
<pre>if (oSession.oRequest.headers.Exists("Cookie")){</pre>
<pre>oSession["ui-color"] = "purple";</pre>
<pre>oSession["ui-bold"] = "cookie";</pre>
<pre>}</pre>
<pre>}</pre>
<p><strong>通过加入Inspectors来扩展Fiddler</strong></p>
<p>用户可以加入一个Inspector插件对象，来使用.net下的任何语言来编写Fiddler扩展。RequestInspectors 和 ResponseInspectors提供一个格式规范的，或者是被指定的（用户自定义）Http请求和响应视图。</p>
<p>默认安装中，Fiddler加入了一下的Inspectors：</p>
<p>Request Inspectors</p>
<p>[RW] Headers—Shows request headers and status.</p>
<p>[RW] TextView—Shows the request body in a text box. （原始的请求body视图）</p>
<p>[RW] HexView—Shows the request body in a hexadecimal view. （body的16进制视图）</p>
<p>[RO] XML—Shows the request body as an XML DOM in a tree view.（以XML方式展示请求）</p>
<p>Response Inspectors</p>
<p>[RW] Transformer—Removes GZip, DEFLATE, and CHUNKED encodings for easier debugging.</p>
<p>[RW] Headers—Shows response headers and status.</p>
<p>[RW] TextView—Shows the response body in a text box.</p>
<p>[RW] HexView—Shows the response body in a hexadecimal view. （16进制视图）</p>
<p>[RO] ImageView—Shows the response body as an Image. Supports all .NET image formats.</p>
<p>[RO] XML—Shows the response body as an XML DOM in a tree view.</p>
<p>[RO] Privacy—Explains the P3P statement in the response headers, if present.（如果在响应头中有关于隐私策略的说明就展示出来）<br />
<br />
转自http://hi.baidu.com/zdz8207/blog/item/6542fe1f503c4a0c304e15c4.html</p>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/316237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-23 09:41 <a href="http://www.blogjava.net/ebecket/archive/2010/03/23/316237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# WinForm 上传图片，文件到服务器的方法Uploader.ashx</title><link>http://www.blogjava.net/ebecket/archive/2010/03/22/316182.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 22 Mar 2010 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/22/316182.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316182.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/22/316182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316182.html</trackback:ping><description><![CDATA[<p>网上有很多方案，起初用时，因为对asp.net不太了解，觉得FTP实现不错，可是后来发现，如果机器在域控下，就会有问题。</p>
<p>一年过去了，asp.net也熟悉了，知道ajax没事应该用ashx，验证码也用ashx，当然这里要说的WinForm上传也应该是ashx了吧，哈哈，先提供简单思路：</p>
<p>接收文件的asp.net是：Uploader.ashx，相关代码：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">?</a></div>
</div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;%@&nbsp;WebHandler&nbsp;Language=</span><span class="string">"C#"</span><span>&nbsp;Class=</span><span class="string">"Uploader"</span><span>&nbsp;%&gt; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">using</span><span>&nbsp;System; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">using</span><span>&nbsp;System.IO; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">using</span><span>&nbsp;System.Web; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Uploader&nbsp;:&nbsp;IHttpHandler &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ProcessRequest(HttpContext&nbsp;hc) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span>&nbsp;(</span><span class="keyword">string</span><span>&nbsp;fileKey&nbsp;</span><span class="keyword">in</span><span>&nbsp;hc.Request.Files) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpPostedFile&nbsp;file&nbsp;=&nbsp;hc.Request.Files[fileKey]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.SaveAs(Path.Combine(hc.Server.MapPath(</span><span class="string">"."</span><span>),&nbsp;file.FileName)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">bool</span><span>&nbsp;IsReusable &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">get</span><span>&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none" class="csharp" name="code" filename="Uploader.ashx">&lt;%@ WebHandler Language="C#" Class="Uploader" %&gt;
using System;
using System.IO;
using System.Web;
public class Uploader : IHttpHandler
{
public void ProcessRequest(HttpContext hc)
{
foreach (string fileKey in hc.Request.Files)
{
HttpPostedFile file = hc.Request.Files[fileKey];
file.SaveAs(Path.Combine(hc.Server.MapPath("."), file.FileName));
}
}
public bool IsReusable
{
get { return true; }
}
}</pre>
<p>&nbsp;发送图片或文件的WinForm.cs 相关代码：<br />
&nbsp;</p>
<div>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">?</a></div>
</div>
<ol class="dp-c">
    <li class="alt"><span><span>System.Net.WebClient&nbsp;myWebClient&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;System.Net.WebClient(); &nbsp;&nbsp;</span></span></li>
    <li><span>myWebClient.UploadFile(</span><span class="string">"http://www.yongfa365.com/Uploader.ashx"</span><span>,&nbsp;</span><span class="string">"POST"</span><span>,&nbsp;</span><span class="string">"C:\\WINDOWS\\system32\\cmd.exe"</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre style="display: none" class="csharp" name="code" filename="WinForm.Uploader.cs">System.Net.WebClient myWebClient = new System.Net.WebClient();
myWebClient.UploadFile("http://www.yongfa365.com/Uploader.ashx", "POST", "C:\\WINDOWS\\system32\\cmd.exe");</pre>
</div>
<p>OK,完了，这样操作后，再也不用管是不是在域控内了，只要能上网，就能上传。够方便吧。</p>
<hr />
<p>如果你要批量上传，还有上传后保存在哪个目录等操作可以参考<a title="柳永法(yongfa365)'Blog http://www.yongfa365.com" href="http://www.yongfa365.com/">柳永法(yongfa365)'Blog</a>写的：</p>
<p>接收文件的asp.net是：Uploader.ashx，相关代码：</p>
<div>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">?</a></div>
</div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;%@&nbsp;WebHandler&nbsp;Language=</span><span class="string">"C#"</span><span>&nbsp;Class=</span><span class="string">"Uploader"</span><span>&nbsp;%&gt; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">using</span><span>&nbsp;System; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="keyword">using</span><span>&nbsp;System.IO; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">using</span><span>&nbsp;System.Web; &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Uploader&nbsp;:&nbsp;IHttpHandler &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ProcessRequest(HttpContext&nbsp;hc) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">string</span><span>&nbsp;NowPath&nbsp;=&nbsp;Path.Combine(hc.Server.MapPath(</span><span class="string">"."</span><span>),&nbsp;hc.Request[</span><span class="string">"path"</span><span>]); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!Directory.Exists(NowPath)) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Directory.CreateDirectory(NowPath); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">foreach</span><span>&nbsp;(</span><span class="keyword">string</span><span>&nbsp;fileKey&nbsp;</span><span class="keyword">in</span><span>&nbsp;hc.Request.Files) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpPostedFile&nbsp;file&nbsp;=&nbsp;hc.Request.Files[fileKey]; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">string</span><span>&nbsp;FilePath&nbsp;=&nbsp;Path.Combine(NowPath,&nbsp;file.FileName); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(File.Exists(FilePath)) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(Convert.ToBoolean(hc.Request[</span><span class="string">"overwrite"</span><span>])) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File.Delete(FilePath); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.SaveAs(FilePath); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">bool</span><span>&nbsp;IsReusable &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">get</span><span>&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>;&nbsp;} &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none" class="csharp" name="code" filename="Uploader2.ashx">&lt;%@ WebHandler Language="C#" Class="Uploader" %&gt;
using System;
using System.IO;
using System.Web;
public class Uploader : IHttpHandler
{
public void ProcessRequest(HttpContext hc)
{
string NowPath = Path.Combine(hc.Server.MapPath("."), hc.Request["path"]);
if (!Directory.Exists(NowPath))
{
Directory.CreateDirectory(NowPath);
}
foreach (string fileKey in hc.Request.Files)
{
HttpPostedFile file = hc.Request.Files[fileKey];
string FilePath = Path.Combine(NowPath, file.FileName);
if (File.Exists(FilePath))
{
if (Convert.ToBoolean(hc.Request["overwrite"]))
{
File.Delete(FilePath);
}
else
{
continue;
}
}
file.SaveAs(FilePath);
}
}
public bool IsReusable
{
get { return true; }
}
}</pre>
</div>
<p>&nbsp;发送图片或文件的WinForm.cs 相关代码：<br />
&nbsp;</p>
<div>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://www.yongfa365.com/Item/WinForm-Uploader.ashx.html#">?</a></div>
</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">string</span><span>&nbsp;url&nbsp;=&nbsp;@</span><span class="string">"http://www.yongfa365.com/Uploader.ashx?Overwrite=true&amp;PATH=Logs\"&nbsp;+&nbsp;DateTime.Now.ToString("</span><span>yyyy-MM-dd"); &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">foreach</span><span>&nbsp;(</span><span class="keyword">string</span><span>&nbsp;file&nbsp;</span><span class="keyword">in</span><span>&nbsp;Directory.GetFiles(item)) &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;System.Net.WebClient&nbsp;myWebClient&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;System.Net.WebClient(); &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;myWebClient.UploadFile(url,&nbsp;</span><span class="string">"POST"</span><span>,&nbsp;file); &nbsp;&nbsp;</span></span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none" class="csharp" name="code" filename="WinForm.Uploader.cs">string url = @"http://www.yongfa365.com/Uploader.ashx?Overwrite=true&amp;PATH=Logs\" + DateTime.Now.ToString("yyyy-MM-dd");
foreach (string file in Directory.GetFiles(item))
{
System.Net.WebClient myWebClient = new System.Net.WebClient();
myWebClient.UploadFile(url, "POST", file);
}
</pre>
</div>
<script language="JavaScript" type="text/javascript">dp.SyntaxHighlighter.ClipboardSwf = '/Common/dp.SyntaxHighlighter/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');</script>
<p>&nbsp;</p>
<br />
引用本页地址：<a href="http://www.yongfa365.com/item/WinForm-Uploader.ashx.html">http://www.yongfa365.com/item/WinForm-Uploader.ashx.html</a>
<img src ="http://www.blogjava.net/ebecket/aggbug/316182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-22 15:57 <a href="http://www.blogjava.net/ebecket/archive/2010/03/22/316182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>using的几种用法 C#</title><link>http://www.blogjava.net/ebecket/archive/2010/03/22/316179.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 22 Mar 2010 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/22/316179.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316179.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/22/316179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316179.html</trackback:ping><description><![CDATA[<p class="alt"><span>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">using&nbsp;用作命名空间指示符&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.IO;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;statement&nbsp;&nbsp;&nbsp;<br />
{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">指定Font类的别名为F&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;F&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.Drawing.Font;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Program&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main(</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;args)&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">using&nbsp;语句管理资源的用法&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;(TextWriter&nbsp;W&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;File.CreateText(</span><span style="color: #000000">"</span><span style="color: #000000">E://test.txt</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W.WriteLine(</span><span style="color: #000000">@"</span><span style="color: #000000">using&nbsp;语句使用：using&nbsp;语句允许程序员指定使用资源的对象应当何时释放资源。有资源管理的语句功能</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">使用别名来实例化对象&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F&nbsp;font&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;F(</span><span style="color: #000000">"</span><span style="color: #000000">宋体</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">12</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W.WriteLine(font.Name.ToString()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;font.Size.ToString());&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">上面的using语句等价于下面的预编译语句&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;Debug&nbsp;&nbsp;&nbsp;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextWriter&nbsp;w&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;File.CreateText(</span><span style="color: #000000">"</span><span style="color: #000000">E://test.txt</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w.WriteLine(</span><span style="color: #000000">@"</span><span style="color: #000000">using&nbsp;语句使用：using&nbsp;语句允许程序员指定使用资源的对象应当何时释放资源。有资源管理的语句功能</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">标准写法，下面语句也可以直接写成w.Dispose()&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(w&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)((IDisposable)w).Dispose();&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endif</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000"><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">可以在using&nbsp;语句中声明对象也可以在using&nbsp;语句之前声明对象，如下：&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextReader&nbsp;R&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;File.OpenText(</span><span style="color: #000000">"</span><span style="color: #000000">E://test.txt</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;(R)&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Stringd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;R.ReadToEnd();&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(Stringd);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;</span></div>
<p class="alt">&nbsp;&nbsp;</span></p>
<pre style="display: none" class="csharp" name="code" filename="using.cs">//using 用作命名空间指示符
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace statement
{
//指定Font类的别名为F
using F = System.Drawing.Font;
class Program
{
static void Main(string[] args)
{
//using 语句管理资源的用法
using (TextWriter W = File.CreateText("E://test.txt"))
{
W.WriteLine(@"using 语句使用：using 语句允许程序员指定使用资源的对象应当何时释放资源。有资源管理的语句功能");
//使用别名来实例化对象
F font = new F("宋体",12);
W.WriteLine(font.Name.ToString() + font.Size.ToString());
}
//上面的using语句等价于下面的预编译语句
#if Debug
TextWriter w = File.CreateText("E://test.txt");
try
{
w.WriteLine(@"using 语句使用：using 语句允许程序员指定使用资源的对象应当何时释放资源。有资源管理的语句功能");
}
finally
{
//标准写法，下面语句也可以直接写成w.Dispose()
if(w != null)((IDisposable)w).Dispose();
}
#endif
//可以在using 语句中声明对象也可以在using 语句之前声明对象，如下：
TextReader R = File.OpenText("E://test.txt");
using (R)
{
string Stringd = R.ReadToEnd();
Console.WriteLine(Stringd);
}
}
}
}</pre>
<p>&nbsp;</p>
<p>我最常用的是：</p>
<p>using (SqlConnection conn = new SqlConnection(SqlHelper.SqlConnection))<br />
{<br />
&nbsp;&nbsp;&nbsp; DataView dv = SqlHelper.ExecuteDataset(conn, CommandType.Text, sql).Tables[0].DefaultView;<br />
}</p>
<script language="JavaScript" type="text/javascript">dp.SyntaxHighlighter.ClipboardSwf = '/Common/dp.SyntaxHighlighter/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');</script><br />
引用本页地址：<a href="http://www.yongfa365.com/item/using.html">http://www.yongfa365.com/item/using.html</a> 
<img src ="http://www.blogjava.net/ebecket/aggbug/316179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-22 15:51 <a href="http://www.blogjava.net/ebecket/archive/2010/03/22/316179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSON in .Net</title><link>http://www.blogjava.net/ebecket/archive/2010/03/22/316171.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 22 Mar 2010 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/22/316171.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316171.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/22/316171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316171.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文PDF下载本文结构 JSON简介JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它易于编程人员阅读和编写，同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的...&nbsp;&nbsp;<a href='http://www.blogjava.net/ebecket/archive/2010/03/22/316171.html'>阅读全文</a><img src ="http://www.blogjava.net/ebecket/aggbug/316171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-22 15:31 <a href="http://www.blogjava.net/ebecket/archive/2010/03/22/316171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google与Microsoft为jQuery,Prototype,MooTools等类库提供CDN服务</title><link>http://www.blogjava.net/ebecket/archive/2010/03/22/316169.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 22 Mar 2010 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/22/316169.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316169.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/22/316169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316169.html</trackback:ping><description><![CDATA[<p>以前在网站中都是这么引入jquery脚本库的：<br />
<span style="color: #ff0000">&lt;script type="text/javascript" src="/Comm/jQuery.min.js"&gt;&lt;/script&gt;</span><br />
有时还要引入其它比较大的脚本类库，如：Prototype，每次引入时<a title="柳永法(yongfa365)'Blog http://www.yongfa365.com" href="http://www.yongfa365.com/">柳永法(yongfa365)'Blog</a>都得考虑：这么大的东西客户打开网页时要多郁闷啊。</p>
<p>现在好了，Google与Microsoft为jQuery,Prototype,MooTools等类库提供CDN服务，这样一来，不在客户在哪访问网站都是通过CDN访问这些脚本，提高了加载速度，减少了加载延迟并获得更好的缓存。<br />
如：<br />
<span style="color: #ff0000">&lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"&gt;&lt;/script&gt;</span><br />
推荐大家使用</p>
<p>相关链接：</p>
<p>Google:<a href="http://code.google.com/apis/ajaxlibs/" target="_blank">http://code.google.com/apis/ajaxlibs/</a><br />
Microsoft:<a href="http://www.asp.net/ajaxlibrary/cdn.ashx" target="_blank">http://www.asp.net/ajaxlibrary/cdn.ashx</a></p>
<p>Google提供的API最多，常用的他全有，像flash: swfobject</p>
<br />
引用本页地址：<a href="http://www.yongfa365.com/item/Google-Microsoft-jQuery-Prototype-MooTools-CDN.html">http://www.yongfa365.com/item/Google-Microsoft-jQuery-Prototype-MooTools-CDN.html</a> 
<img src ="http://www.blogjava.net/ebecket/aggbug/316169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-22 15:20 <a href="http://www.blogjava.net/ebecket/archive/2010/03/22/316169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#中操作XML文件(读写改删全接触)-全了！</title><link>http://www.blogjava.net/ebecket/archive/2010/03/22/316134.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 22 Mar 2010 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/22/316134.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316134.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/22/316134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316134.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316134.html</trackback:ping><description><![CDATA[<p>已知有一个XML文件（bookstore.xml）如下：<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="gb2312"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bookstore</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">book&nbsp;</span><span style="color: #ff0000">genre</span><span style="color: #0000ff">="fantasy"</span><span style="color: #ff0000">&nbsp;ISBN</span><span style="color: #0000ff">="2-3631-4"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Oberon's&nbsp;Legacy</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Corets,&nbsp;Eva</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">5.95</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">book</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bookstore</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
<br />
<span style="color: red">操作<br />
<br />
</span></p>
<p><span style="color: red">1、往&lt;bookstore&gt;节点中插入一个&lt;book&gt;节点</span></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">XmlDocument&nbsp;xmlDoc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;XmlDocument();&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />xmlDoc.Load(</span><span style="color: #000000">"</span><span style="color: #000000">bookstore.xml</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">xmlDoc.LoadXml("&lt;!--l&nbsp;version=\"1.0\"&nbsp;encoding=\"gb2312\--&gt;&lt;BOOKSTORE&gt;&lt;/BOOKSTORE&gt;");&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">XmlNode&nbsp;root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xmlDoc.SelectSingleNode(</span><span style="color: #000000">"</span><span style="color: #000000">bookstore</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">查找&lt;BOOKSTORE&gt;&lt;/BOOKSTORE&gt;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">XmlElement&nbsp;xe1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xmlDoc.CreateElement(</span><span style="color: #000000">"</span><span style="color: #000000">book</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">创建一个&lt;BOOK&gt;&lt;/BOOK&gt;节点&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">xe1.SetAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">genre</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">李赞红</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">设置该节点genre属性&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">xe1.SetAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">ISBN</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">2-3631-4</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">设置该节点ISBN属性&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />XmlElement&nbsp;xesub1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xmlDoc.CreateElement(</span><span style="color: #000000">"</span><span style="color: #000000">title</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />xesub1.InnerText&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">CS从入门到精通</span><span style="color: #000000">"</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">设置文本节点&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">xe1.AppendChild(xesub1);</span><span style="color: #008000">//</span><span style="color: #008000">添加到&lt;BOOK&gt;&lt;/BOOK&gt;节点中&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">XmlElement&nbsp;xesub2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xmlDoc.CreateElement(</span><span style="color: #000000">"</span><span style="color: #000000">author</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />xesub2.InnerText&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">候捷</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />xe1.AppendChild(xesub2);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />XmlElement&nbsp;xesub3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xmlDoc.CreateElement(</span><span style="color: #000000">"</span><span style="color: #000000">price</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />xesub3.InnerText&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">58.3</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />xe1.AppendChild(xesub3);&nbsp;&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />root.AppendChild(xe1);</span><span style="color: #008000">//</span><span style="color: #008000">添加到&lt;BOOKSTORE&gt;&lt;/BOOKSTORE&gt;节点中&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">xmlDoc.Save(</span><span style="color: #000000">"</span><span style="color: #000000">bookstore.xml</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<br />
结果为：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="gb2312"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bookstore</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">book&nbsp;</span><span style="color: #ff0000">genre</span><span style="color: #0000ff">="fantasy"</span><span style="color: #ff0000">&nbsp;ISBN</span><span style="color: #0000ff">="2-3631-4"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Oberon's&nbsp;Legacy</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Corets,&nbsp;Eva</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">5.95</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">book</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">book&nbsp;</span><span style="color: #ff0000">genre</span><span style="color: #0000ff">="李赞红"</span><span style="color: #ff0000">&nbsp;ISBN</span><span style="color: #0000ff">="2-3631-4"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">CS从入门到精通</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">候捷</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">58.3</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">book</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bookstore</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
<br />
<span style="color: red">2.修改节点：将genre属性值为&#8220;李赞红&#8220;的节点的genre值改为&#8220;update李赞红&#8221;，将该节点的子节点&lt;author&gt;的文本修改为&#8220;亚胜&#8221;。<br />
<br />
</span>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">XmlNodeList&nbsp;nodeList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xmlDoc.SelectSingleNode(</span><span style="color: #000000">"</span><span style="color: #000000">bookstore</span><span style="color: #000000">"</span><span style="color: #000000">).ChildNodes;</span><span style="color: #008000">//</span><span style="color: #008000">获取bookstore节点的所有子节点&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(XmlNode&nbsp;xn&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;nodeList)</span><span style="color: #008000">//</span><span style="color: #008000">遍历所有子节点&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XmlElement&nbsp;xe&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(XmlElement)xn;</span><span style="color: #008000">//</span><span style="color: #008000">将子节点类型转换为XmlElement类型&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(xe.GetAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">genre</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">李赞红</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #008000">//</span><span style="color: #008000">如果genre属性值为&#8220;李赞红&#8221;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xe.SetAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">genre</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">update李赞红</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">则修改该属性为&#8220;update李赞红&#8221;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlNodeList&nbsp;nls&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xe.ChildNodes;</span><span style="color: #008000">//</span><span style="color: #008000">继续获取xe子节点的所有子节点&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(XmlNode&nbsp;xn1&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;nls)</span><span style="color: #008000">//</span><span style="color: #008000">遍历&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlElement&nbsp;xe2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(XmlElement)xn1;</span><span style="color: #008000">//</span><span style="color: #008000">转换类型&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(xe2.Name&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">author</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #008000">//</span><span style="color: #008000">如果找到&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xe2.InnerText&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">亚胜</span><span style="color: #000000">"</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">则修改&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">找到退出来就可以了&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
xmlDoc.Save(</span><span style="color: #000000">"</span><span style="color: #000000">bookstore.xml</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">保存。</span></div>
<br />
结果：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="gb2312"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bookstore</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">book&nbsp;</span><span style="color: #ff0000">genre</span><span style="color: #0000ff">="fantasy"</span><span style="color: #ff0000">&nbsp;ISBN</span><span style="color: #0000ff">="2-3631-4"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Oberon's&nbsp;Legacy</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Corets,&nbsp;Eva</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">5.95</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">book</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">book&nbsp;</span><span style="color: #ff0000">genre</span><span style="color: #0000ff">="update李赞红"</span><span style="color: #ff0000">&nbsp;ISBN</span><span style="color: #0000ff">="2-3631-4"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">CS从入门到精通</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">亚胜</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">58.3</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">book</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bookstore</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<br />
<br />
<span style="color: red">3、删除 &lt;book genre="fantasy" ISBN="2-3631-4"&gt;节点的genre属性，删除 &lt;book genre="update李赞红" ISBN="2-3631-4"&gt;节点。<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">XmlNodeList&nbsp;xnl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xmlDoc.SelectSingleNode(</span><span style="color: #000000">"</span><span style="color: #000000">bookstore</span><span style="color: #000000">"</span><span style="color: #000000">).ChildNodes;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(XmlNode&nbsp;xn&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;xnl)&nbsp;&nbsp;&nbsp;<br />
{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XmlElement&nbsp;xe&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(XmlElement)xn;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(xe.GetAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">genre</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">fantasy</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xe.RemoveAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">genre</span><span style="color: #000000">"</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">删除genre属性&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(xe.GetAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">genre</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">update李赞红</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xe.RemoveAll();</span><span style="color: #008000">//</span><span style="color: #008000">删除该节点的全部内容&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;&nbsp;<br />
xmlDoc.Save(</span><span style="color: #000000">"</span><span style="color: #000000">bookstore.xml</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
<br />
结果<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="gb2312"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bookstore</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">book&nbsp;</span><span style="color: #ff0000">ISBN</span><span style="color: #0000ff">="2-3631-4"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Oberon's&nbsp;Legacy</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Corets,&nbsp;Eva</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">author</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">5.95</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">price</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">book</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">book</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">book</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bookstore</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<br />
<br />
4、显示所有数据。<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">XmlNode&nbsp;xn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xmlDoc.SelectSingleNode(</span><span style="color: #000000">"</span><span style="color: #000000">bookstore</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
XmlNodeList&nbsp;xnl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xn.ChildNodes;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(XmlNode&nbsp;xnf&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;xnl)&nbsp;&nbsp;&nbsp;<br />
{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XmlElement&nbsp;xe&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(XmlElement)xnf;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(xe.GetAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">genre</span><span style="color: #000000">"</span><span style="color: #000000">));</span><span style="color: #008000">//</span><span style="color: #008000">显示属性值&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(xe.GetAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">ISBN</span><span style="color: #000000">"</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XmlNodeList&nbsp;xnf1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xe.ChildNodes;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(XmlNode&nbsp;xn2&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;xnf1)&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(xn2.InnerText);</span><span style="color: #008000">//</span><span style="color: #008000">显示子节点点文本&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;&nbsp;<br />
</span></div>
<br />
<br />
参考资料来源：<br />
<a href="http://www.yongfa365.com/item/CZhongCaoZuoXMLWenJianDuXieGaiShanQuanJieChuGenQiTaYuYanCaoZuoXMLChaBuDuoYiYang.html">http://www.yongfa365.com/item/CZhongCaoZuoXMLWenJianDuXieGaiShanQuanJieChuGenQiTaYuYanCaoZuoXMLChaBuDuoYiYang.html</a></span>
<img src ="http://www.blogjava.net/ebecket/aggbug/316134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-22 11:18 <a href="http://www.blogjava.net/ebecket/archive/2010/03/22/316134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>声明式数据绑定教程－SqlDataSource 与 GridView</title><link>http://www.blogjava.net/ebecket/archive/2010/03/22/316113.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 22 Mar 2010 01:10:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/22/316113.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316113.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/22/316113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316113.html</trackback:ping><description><![CDATA[<p>转自 千一网络<br />
<br />
.NET 2.0 中新增了声明式数据绑定功能，可以不需要编程，做些配置就可以实现基本的数据管理功能，这又为我们减轻不了不少工作量。</p>
<p>本连载讲解 SqlDataSource 和 ObjectDataSource 两个数据源控件，讲解 GridView 和 DetailsView 两个呈现控件。</p>
<ul>
    <li>SqlDataSource&nbsp;控件将数据库与呈现控件关联起来。
    <li>ObjectDataSource 控件将一个提供数据的类与呈现控件关联起来。
    <li>GridView 控件提供列表显示、编辑、删除记录。
    <li>DetailsView 控件提供对一条记录进行显示、编辑、删除和插入。</li>
</ul>
<p>先从 SqlDataSource 和 GridView 开始。</p>
<p><span class="itemTitle">第一步</span></p>
<ul>
    <li>建立数据库，我们建立一个新闻数据库，命名为 news。
    <li>建立表，我们建立一个文档表，命名为 cftea_docs，字段分别为：id（标识）、title、content。
    <li>在 cftea_docs 中随便加入两条新闻。</li>
</ul>
<p><span class="itemTitle">第二步</span></p>
<ul>
    <li>打开 Visual Web Developer，新建一个 Web Form。
    <li>在网页中拖入 SqlDataSource 和 GridView 控件。</li>
</ul>
<div class="code">&lt;<span class="key">asp:SqlDataSource</span> ID="SqlDataSource1" runat="server"&gt;&lt;/asp:SqlDataSource&gt;<br />
</div>
<div class="code"><br />
&lt;<span class="key">asp:GridView</span> ID="GridView1" runat="server"&gt;&lt;/asp:GridView&gt;</div>
<p>你可以在设计视图配置，也可以通过代码视图配置，为了更好地了解及应用这些控件，我们在代码视图配置。将上述源代码改为如下：</p>
<div class="code">&lt;asp:SqlDataSource ID="SqlDataSource1" runat="server"<br />
&nbsp;&nbsp;&nbsp; ProviderName="System.Data.SqlClient"<br />
&nbsp;&nbsp;&nbsp; <span class="caution">ConnectionString="Data Source=(local);Persist Security Info=False;User ID=news;Password=news;Initial Catalog=news;"</span><br />
&nbsp;&nbsp;&nbsp; <span class="caution">SelectCommand="select * from cftea_docs"&gt;</span><br />
&lt;/asp:SqlDataSource&gt;<br />
<br />
&lt;asp:GridView ID="GridView1" runat="server" <span class="caution">DataSourceID="SqlDataSource1"</span>&gt;<br />
&lt;/asp:GridView&gt;</div>
<ul>
    <li>ConnectionString 是字符串连接，根据你的实际情况修改。请参见<a href="http://www.cftea.com/specials/dbconn/" target="_blank">数据库连接专题</a>。
    <li>由于使用的是 SQL Server 数据库，所以 ProviderName 可以省略。</li>
</ul>
<p>按下 Ctrl + F5，得类似如下运行结果：</p>
<p align="center"><img border="0" alt="数据绑定示例" src="http://www.cftea.com/c/2008/03/M907V1BJCLZT192M/FC7APB7SU2HGOJFV.png" /></p>
<p align="center">一个数据源控件可以被多个呈现控件引用</p>
<img src ="http://www.blogjava.net/ebecket/aggbug/316113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-22 09:10 <a href="http://www.blogjava.net/ebecket/archive/2010/03/22/316113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET 与 XML－XmlTextReader</title><link>http://www.blogjava.net/ebecket/archive/2010/03/22/316112.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 22 Mar 2010 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/22/316112.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316112.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/22/316112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316112.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316112.html</trackback:ping><description><![CDATA[<p>XmlTextReader 用于快速的只进的读取 XML。</p>
<p>XmlTextReader 的名称空间是：</p>
<pre class="code">System.Xml</pre>
<p><span class="itemTitle">应用示例</span></p>
<pre class="code">XmlTextReader reader = new XmlTextReader(xmlFragment, XmlNodeType.Element, null);<br />
while (reader.Read())<br />
{<br />
if (reader.NodeType == XmlNodeType.Element)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;    if (reader.Name == "state")<br />
{<br />
State = (SendingShipState)Convert.ToInt32(reader.ReadString());<br />
}<br />
else if (reader.Name == "message")<br />
{<br />
MyMessage.AnalyzeXml(reader.ReadInnerXml());<br />
}<br />
else if (reader.Name == "writer")<br />
{<br />
Writer = reader.ReadString();<br />
}<br />
}<br />
}<br />
reader.Close();</pre>
<p>XmlTextReader 有多个构造函数，参数可以使用 Url（网址或文件路径）、Stream、TextReader、XML 字符串等，这里使用的是 XML 字符串。</p>
<p>XmlTextReader 是不允许后退的，所以使用 reader.Read() 从前往后读，再判断当前已经读取的节点的类型，注意：Whitespace 也是一种节点。</p>
<p>然后我们再根据 Name 属性值判断标签名称，比如 &lt;root&gt; 的 Name 属性值是 root。</p>
<p>MyMessage.AnalyzeXml(reader.ReadInnerXml()); 这里我们将该节点下面的所有 XML 内容交给另一个对象处理。</p>
<p><span class="itemTitle">取属性值</span></p>
<div class="code">XmlTextReader reader = new XmlTextReader("data.xml");<br />
while (reader.Read())<br />
{<br />
&nbsp;&nbsp;&nbsp; if (reader.NodeType == XmlNodeType.Element &amp;&amp; reader.Name == "category")<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox.Show(reader.GetAttribute("text"));<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
reader.Close();</div>
<p><span class="chapterTitle">相关阅读</span></p>
<ul>
    <li><a href="http://www.cftea.com/c/2009/08/TY1T2HTH7TY3NXGD.asp" target="_blank">LINQ 步步学－LINQ to XML</a></li>
</ul>
<p>http://www.cftea.com/c/2009/08/TY1T2HTH7TY3NXGD.asp</p>
<img src ="http://www.blogjava.net/ebecket/aggbug/316112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-22 09:07 <a href="http://www.blogjava.net/ebecket/archive/2010/03/22/316112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL注入 相关</title><link>http://www.blogjava.net/ebecket/archive/2010/03/22/316111.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 22 Mar 2010 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/03/22/316111.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/316111.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/03/22/316111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/316111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/316111.html</trackback:ping><description><![CDATA[来自 千一网络<br />
<br />
<p>看了小竹的《SQL注入天书之ASP注入漏洞全接触》，感觉这篇文章写得非常好，由浅入深，实例详尽，对新手起到教学作用，对老手起到交流探讨作用，目前近40%的ASP网页均存在此漏洞，可以说《SQL注入天书之ASP注入漏洞全接触》也来得非常实用。</p>
<p>我是从其它网站上拷贝到&#8220;<a href="http://www.cftea.com/">千一网络</a>&#8221;的，我对其中的个别部分进行了修改，我想可能是别人在拷贝这篇文章时把其中的某些部分弄错了，在此向作者说明，其中修改的部分是去掉部分sql语句中的";"号，如：<br />
　　http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)&gt;0 <br />
　　修改为：<br />
http://www.mytest.com/showdetail.asp?id=49 and (select count(*) from sysobjects)&gt;0 </p>
<p><strong>SQL Server注入漏洞可能造成什么损失呢？<br />
　　</strong>轻：查看数据库名、SQL Server连接名、得到表的字段与记录等。<br />
　　重：备份数据库、下载数据库、在计算机内添加管理员等。</p>
<p>&#8220;查看数据库名、SQL Server连接名、得到表的字段与记录&#8221;之类的攻击，对于存在注入漏洞的网页一般都可实现。但若是使用Web管理网站，Web的密码又没加密，这样事态就变严重了。另外对于SELECT语句，如果没有控制好LockType（应设置为adLockReadOnly），也是很严重的。</p>
<p><strong>对于ASP＋SQL Server如何彻底防范注入漏洞：</strong><strong><br />
</strong>　　一、对进入sql语句的数字先进行类型转换<br />
　　二、对进入sql语句的字符，将单引号("'")替换为两个单引号("''")或其它</p>
<p>仅此两点即可，也许有人会问，那么文中第8页所说：<br />
</p>
<div class="code">在入门篇提到，有很多人喜欢用&#8217;号测试注入漏洞，所以也有很多人用过滤&#8217;号的方法来&#8220;防止&#8221;注入漏洞，这也许能挡住一些入门者的攻击，但对SQL注入比较熟悉的人，还是可以利用相关的函数，达到绕过程序限制的目的。</div>
　　是什么意思呢？既然说进行类型转换，过滤掉"'"就可以了，这里怎么又说可以绕过"'"的限制呢？其实，这里所说的是指对数字类型或我们注入添加的sql。也就是说：<br />
<p>对sql = "&#8230;&#8230;where id=" &amp; request.QueryString("id")<br />
　　用**.asp?id=char(50)，char会起到函数的作用</p>
<p>或者where xtype=char(85)（见文中第8页），char也会起到函数的作用。</p>
<p>但对于sql = "&#8230;&#8230;where key='"&nbsp;&amp;&nbsp;request.QueryString("key") &amp; "'"<br />
　　用**.asp?key=char(50)，这里的char(50)是不起作用的，为什么呢？<br />
　　套入sql一看，语句是这样的：<br />
　　sql = "&#8230;&#8230;where key='char(50)'"<br />
　　char(50)位于"'"内，变成了字符（串），所以就起不到函数的作用了。</p>
<p><strong>养成好的习惯，制定统一的规范<br />
　　</strong>上面的方法确实解决了注入漏洞问题，但并不表示其它地方可以马虎了，为什么要马虎了，为什么要让自己的网页千疮百孔，让几句代码去独挡一面呢？如果不养成好的习惯，团体之间如果不制定统一的规范，今天这个问题解决了，明天那个问题还会出现。</p>
<p>１、使用RecordSet记录集之前必须判断RecordSet的BOF或EOF属性。<br />
　　２、对于SELECT语句，除了不得已的情况，LockType必须设置为adLockReadOnly。<br />
　　３、放入数据库中的密码应该使用良好的加密算法进行加密，同时也禁止密码以明文的形式存在于页面文件中。<br />
　　４、在Web条件下，在非本机调试的情况下，不得使用sa连接数据库。<br />
　　５、对于需要用户权限的平台，必须将用户名和密码载入session，然后在需要的页面进行判断，不得使用if session("loginOK")&lt;&gt;"" then之类的语句来判断用户是否是合法用户。<br />
　　&#8230;&#8230;<br />
　　必要时，可以禁止IIS返回详细的出错信息，可以禁止public对sysobjects表的SELECT权限。<br />
　　&#8230;&#8230;</p>
<p>安全不是一方面的，仅靠几个规范几个好的习惯并不能保证能造就出安全的空间，1个False与99个True进行&#8220;与&#8221;运算，结果还是False，从中可以看出，哪怕只有一点错误，都可能导致结果全盘被否定。Web安全，除了注入漏洞，还有FTP设置错误、Web服务设置错误、后台程序漏洞这些最最基本的都可能导致服务器整个被人控制，所以处处都要三思啊。</p>
<br />
再次说明防注入不是替换关键字！<br />
<br />
<p>最近又看到很多关于 SQL 注入的帖子，都是使用替换 select、delete、update 等字符串的方法来防注入的。</p>
<p><span class="itemTitle">再说明一下，这种是错误的防注入方法，原因如下：</span></p>
<ol>
    <li>可能替换不全，不是所有的关键字都列入其中了的。
    <li>本身这种替换就有漏洞，比如 aandnd 本身没有问题，把其中的 and 替换掉后，反而冒出一个 and 出来。
    <li>这种替换方式还破坏了文字的原义，我曾经在某个网站上注册了 candy 这个用户名，后来该系统却告诉我没有这个用户，后来才知道 candy 中的 and 被去掉了。</li>
</ol>
<p><span class="itemTitle">正确的防注入方法是：</span></p>
<ul>
    <li>对数字类型进入 sql 前强制转换为数字。
    <li>对文本类型进入 sql 前替换单引号为双引号。
    <li>对日期类型进入 sql 前强制转换成日期，并替换单引号为双引号。</li>
</ul>
<p>这是从注入的原理来防的。</p>
<img src ="http://www.blogjava.net/ebecket/aggbug/316111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-03-22 09:01 <a href="http://www.blogjava.net/ebecket/archive/2010/03/22/316111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析C#基于TCP协议的SCOKET通信</title><link>http://www.blogjava.net/ebecket/archive/2010/01/28/311143.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Thu, 28 Jan 2010 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/28/311143.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/311143.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/28/311143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/311143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/311143.html</trackback:ping><description><![CDATA[TCP协议是一个基本的网络协议，基本上所有的网络服务都是基于TCP协议的，如HTTP，FTP等等，所以要了解网络编程就必须了解基于TCP协议的编程。然而TCP协议是一个庞杂的体系，要彻底的弄清楚它的实现不是一天两天的功夫，所幸的是在。net framework环境下，我们不必要去追究TCP协议底层的实现，一样可以很方便的编写出基于TCP协议进行网络通讯的程序。
<p><strong>C#基于TCP协议的网络通讯</strong></p>
<p>&nbsp;&nbsp;&nbsp; 要进行C#基于TCP协议的网络通讯，首先必须建立同远程主机的连接，连接地址通常包括两部分——主机名和端口，如<a href="http://www.yesky.com/">www.yesky.com</a>：80中， www.yesky.com就是主机名，80指主机的80端口，当然，主机名也可以用IP地址代替。当连接建立之后，就可以使用这个连接去发送和接收数据包，TCP协议的作用就是保证这些数据包能到达终点并且能按照正确的顺序组装起来。</p>
<p>&nbsp;&nbsp;&nbsp; 在。net framework的类库（Class Library）中，提供了两个用于TCP网络通讯的类，分别是TcpClient和TcpListener.由其英文意义显而易见，TcpClient 类是基于TCP协议的客户端类，而TcpListener是服务器端，监听（Listen）客户端传来的连接请求。TcpClient类通过TCP协议与服务器进行通讯并获取信息，它的内部封装了一个Socket类的实例，这个Socket对象被用来使用TCP协议向服务器请求和获取数据。因为与远程主机的交互是以数据流的形式出现的，所以传输的数据可以使用。net framework中流处理技术读写。在我们下边的例子中，你可以看到使用NetworkStream类操作数据流的方法。</p>
<p>&nbsp;&nbsp;&nbsp; 在下面的例子中，我们将建立一个时间服务器，包括服务器端程序和客户端程序。服务器端监听客户端的连接请求，建立连接以后向客户端发送当前的系统时间。</p>
<p>&nbsp;&nbsp;&nbsp; 先运行服务器端程序，下面截图显示了服务器端程序运行的状况：</p>
<p>&nbsp;&nbsp;&nbsp; 然后运行客户端程序，客户端首先发送连接请求到服务器端，服务器端回应后发送当前时间到客户端，这是客户端程序的截图：</p>
<p>&nbsp;&nbsp;&nbsp; 发送完成后，服务器端继续等待下一次连接：</p>
<p>&nbsp;&nbsp;&nbsp; 通过这个例子我们可以了解TcpClient类的基本用法，要使用这个类，必须使用System.Net.Socket命名空间，本例用到的三个命名空间如下：</p>
<pre>
<ol class="dp-xml">
    <li class="alt"><span><span>using&nbsp;System; &nbsp;</span></span>
    <li><span>using&nbsp;System.Net.Sockets; &nbsp;</span>
    <li class="alt"><span>using&nbsp;System.Text; &nbsp;</span>
    <li><span>//从字节数组中获取字符串时使用该命名空间中的类 &nbsp;</span>
    <li class="alt"><span>//首先讨论一下客户端程序，开始我们必须初始化一个TcpClient类的实例： &nbsp;</span>
    <li><span>&nbsp;</span>
    <li class="alt"><span>TcpClient&nbsp;</span><span class="attribute"><font color="#ff0000">client</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;TcpClient(hostName,&nbsp;portNum); &nbsp;</span>
    <li><span>//然后使用TcpClient类的GetStream()方法获取数据流，<br />
    并且用它初始化一个NetworkStream类的实例： &nbsp;</span>
    <li class="alt"><span>&nbsp;</span>
    <li><span>NetworkStream&nbsp;</span><span class="attribute"><font color="#ff0000">ns</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">client</font></span><span>.GetStream();&nbsp;</span></li>
</ol>
</pre>
<p>&nbsp;&nbsp;&nbsp; 注意，当使用主机名和端口号初始化TcpClient类的实例时，直到跟服务器建立了连接，这个实例才算真正建立，程序才能往下执行。如果因为网络不通，服务器不存在，服务器端口未开放等等原因而不能连接，程序将抛出异常并且中断执行。</p>
<p>&nbsp;&nbsp;&nbsp; 建立数据流之后，我们可以使用NetworkStream类的Read（）方法从流中读取数据，使用Write（）方法向流中写入数据。读取数据时，首先应该建立一个缓冲区，具体的说，就是建立一个byte型的数组用来存放从流中读取的数据。Read（）方法的原型描述如下：</p>
<pre>
<ol class="dp-xml">
    <li class="alt"><span><span>public&nbsp;override&nbsp;int&nbsp;Read（in&nbsp;byte[]&nbsp;buffer，int&nbsp;offset，int&nbsp;size）&nbsp;</span></span></li>
</ol>
</pre>
<p>&nbsp;&nbsp;&nbsp; buffer是缓冲数组，offset是数据（字节流）在缓冲数组中存放的开始位置，size是读取的字节数目，返回值是读取的字节数。在本例中，简单地使用该方法来读取服务器反馈的信息：</p>
<pre>
<ol class="dp-xml">
    <li class="alt"><span><span>byte[]&nbsp;</span><span class="attribute"><font color="#ff0000">bytes</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">new</font></span><span>&nbsp;byte[1024];//建立缓冲区 &nbsp;</span></span>
    <li><span>int&nbsp;</span><span class="attribute"><font color="#ff0000">bytesRead</font></span><span>&nbsp;=&nbsp;</span><span class="attribute-value"><font color="#0000ff">ns</font></span><span>.Read(bytes,&nbsp;0,&nbsp;bytes.Length);//读取字节流 &nbsp;</span>
    <li class="alt"><span>//　然后显示到屏幕上： &nbsp;</span>
    <li><span>Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead)); &nbsp;</span>
    <li><span>//最后不要忘记关闭连接： &nbsp;</span>
    <li class="alt"><span>&nbsp;</span>
    <li><span>client.Close();&nbsp;</span></li>
</ol>
</pre>
<p>&nbsp;&nbsp;&nbsp; 以上介绍C#基于TCP协议的网络通讯。</p>
<img src ="http://www.blogjava.net/ebecket/aggbug/311143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-28 22:11 <a href="http://www.blogjava.net/ebecket/archive/2010/01/28/311143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析ASP.NET的IIS映射</title><link>http://www.blogjava.net/ebecket/archive/2010/01/25/310781.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 25 Jan 2010 12:49:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/25/310781.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310781.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/25/310781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310781.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; ASP.NET默认扩展名为.aspx，可是我们看到许多网站的扩展名很特别，比如校内的do。个性之余还可以实现简单的伪静态（即把后缀改为html）不过相对URLRewriter来说，是有点简陋（只能改掉连接中的.aspx），不过不失为一种方法。下面我们就来实现他！
<p>&nbsp;&nbsp;&nbsp; 先来说一下ASP.NET 1.1中的方法：</p>
<p>&nbsp;&nbsp;&nbsp; 1.ASP.NET IIS映射（IIS-&gt;默认网站-&gt;属性-&gt;主文档-&gt;配置-&gt;映射-&gt;添加）:</p>
<p>&nbsp;&nbsp;&nbsp; 扩展名.do ----&gt; C:"WINNT"Microsoft.NET"Framework"v1.1.4322"aspnet_isapi.dll</p>
<p>&nbsp;&nbsp;&nbsp; 限于:GET,HEAD,POST,DEBUG</p>
<p>&nbsp;&nbsp;&nbsp; 2.修改web.config</p>
<p>&nbsp;&nbsp;&nbsp; &lt;configuration&gt; &lt;system.web&gt; &lt;httpHandlers&gt; &lt;add verb="*" path="*.mspx" type="System.Web.UI.PageHandlerFactory" /&gt; httpHandlers&gt; system.web&gt; configuration&gt;</p>
<p>&nbsp;&nbsp;&nbsp; ASP.NET2.0配置稍有不同，详解如下：</p>
<p>&nbsp;&nbsp;&nbsp; 1.ASP.NET IIS映射（IIS-&gt;默认网站-&gt;属性-&gt;主文档-&gt;配置-&gt;映射-&gt;添加）:</p>
<p>&nbsp;&nbsp;&nbsp; 扩展名.do ----&gt; C:"WINDOWS"Microsoft.NET"Framework"v2.0.50727"aspnet_isapi.dll</p>
<p>&nbsp;&nbsp;&nbsp; 限于:GET,HEAD,POST,DEBUG</p>
<p>&nbsp;&nbsp;&nbsp; 2.修改web.config</p>
<p>&nbsp;&nbsp;&nbsp; &lt;configuration&gt; &lt;system.web&gt; &lt;httpHandlers&gt; &lt;add path="*.do" verb="*" type="System.Web.UI.PageHandlerFactory" /&gt; httpHandlers&gt; &lt;compilation&gt; &lt;buildProviders&gt; &lt;add extension=".do" type="System.Web.Compilation.PageBuildProvider" /&gt; buildProviders&gt; compilation&gt; system.web&gt; &lt;configuration&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 以上介绍ASP.NET IIS映射</p>
<img src ="http://www.blogjava.net/ebecket/aggbug/310781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-25 20:49 <a href="http://www.blogjava.net/ebecket/archive/2010/01/25/310781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.Net 2.0中的5个数据控件</title><link>http://www.blogjava.net/ebecket/archive/2010/01/25/310780.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 25 Jan 2010 12:48:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/25/310780.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310780.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/25/310780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310780.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310780.html</trackback:ping><description><![CDATA[第一篇asp.net的入门帖，就先从数据控件开始吧！　　 <br />
<br />
　　ASP<a class="channel_keylink" href="http://dotnet.chinaitlab.com/" target="_blank">.Net</a> 2.0中的5个数据控件:GridView,DataList,Repeater ,DetailsView,FormView。 <br />
<br />
　　<strong>综述：</strong>　　 <br />
<br />
　　1.前3个用于呈现多条记录,后面2个用于呈现单条数据明细,即常用的记录明细。 <br />
<br />
　　2.GridView和DetailsView控件的布局固定,自定义数据显示的布局功能有限,一般适合布局简单的数据呈现。3.DataList,Repeater和FormView数据控件都有很强的自定义布局能力,如果数据呈现需要较为复杂的布局方案,这3个控件是首选。 <br />
<br />
　　4.GridView ,DetailsView和FormView这三个都是.net 2.0新增的控件,内置了分页,排序等等功能,其改进程度是1.1所提供控件无法比的。 <br />
<br />
　　5.DataList和Repeater是1.1版就提供的控件,内置功能较弱,需要自己实现分页,排序,数据事件等功能。　　 <br />
<br />
　　有趣的是,在现在的Asp.net平台上,如果从功能上来说呈现单列数据时DetailsView和FormView相对应,DetailsView布局固定FormView自定义布局,呈现多列数据时只有GridView来负责布局固定的数据,从功能上来说,没有对应的控件与GridView相配。　　 <br />
<br />
　　DataList提供的数据功能与GridView相比,实在是太弱了.与GridView几乎不需要编程就能担负数据呈现的重任相比,DataList要求程序员必须自己写代码来实现想要的功能。　　 <br />
<br />
　　<strong>GridView 控件：</strong>　　 <br />
<br />
　　GridView 控件以表的形式显示数据，并提供对列进行排序、分页、翻阅数据以及编辑或删除单个记录的功能。 <br />
<br />
　　注意：GridView 控件是 ASP.NET 的早期版本中提供的 DataGrid 控件的后继控件。除了添加利用数据源控件功能的新功能，GridView 控件还实现了某些改进，例如，定义多个主键字段的功能、使用绑定字段和模板的改进用户界面自定义以及用于处理或取消事件的新模型。 <br />
<br />
　　<strong>DetailsView 控件：</strong>　　 <br />
<br />
　　DetailsView 控件一次呈现一条表格形式的记录，并提供翻阅多条记录以及插入、更新和删除记录的功能。DetailsView 控件通常用在主/详细信息方案中，在这种方案中，主控件（如 GridView 控件）中的所选记录决定了 DetailsView 控件显示的记录。　　 <br />
<br />
　　<strong>FormView 控件：　</strong>　 <br />
<br />
　　FormView 控件与 DetailsView 控件类似，它一次呈现数据源中的一条记录，并提供翻阅多条记录以及插入、更新和删除记录的功能。不过，FormView 控件与 DetailsView 控件之间的差别在于：DetailsView 控件使用基于表格的布局，在这种布局中，数据记录的每个字段都显示为控件中的一行。而 FormView 控件则不指定用于显示记录的预定义布局。实际上，您将创建包含控件的模板，以显示记录中的各个字段。该模板包含用于设置窗体布局的格式、控件和绑定表达式。　　 <br />
<br />
　　<strong>Repeater 控件：</strong> <br />
<br />
　　Repeater 控件使用数据源返回的一组记录呈现只读列表。与 FormView 控件类似，Repeater 控件不指定内置布局。您可以使用模板创建 Repeater 控件的布局。　　 <br />
<br />
　　<strong>DataList 控件：</strong>　　 <br />
<br />
　　DataList 控件以表的形式呈现数据，通过该控件，您可以使用不同的布局来显示数据记录，例如，将数据记录排成列或行的形式。您可以对 DataList 控件进行配置，使用户能够编辑或删除表中的记录。（DataList 控件不使用数据源控件的数据修改功能；您必须自己提供此代码。） 
<img src ="http://www.blogjava.net/ebecket/aggbug/310780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-25 20:48 <a href="http://www.blogjava.net/ebecket/archive/2010/01/25/310780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Socket编程项目之后经验谈</title><link>http://www.blogjava.net/ebecket/archive/2010/01/25/310779.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 25 Jan 2010 12:47:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/25/310779.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310779.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/25/310779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310779.html</trackback:ping><description><![CDATA[我们的项目是用DotNet实现Socket连接，用多线程处理多用户。我就谈一下在实现过程中遇到的问题。下面是我<a class="channel_keylink" href="http://server.chinaitlab.com/" target="_blank">服务器</a>的简化实现。<br />
　　private Socket clientSocket;<br />
　　<br />
　　public void Start()<br />
　　{<br />
　　Thread　thread=new Thread(new ThreadStart(MainService));<br />
　　thread.Start();<br />
　　}<br />
　　void MainService()<br />
　　{<br />
　　listener=new TcpListener(111111);<br />
　　listener.Start();<br />
　　while(true)<br />
　　{<br />
　　Socket s= listener.AcceptSocket();//帧听客户连接<br />
　　clientSocket=s;<br />
　　Thread　clientservice = new Thread(new ThreadStart(ClientService));<br />
　　clientservice.Start();<br />
　　Thread.Sleep(200);//1、等待传值给线程中的变量，防止多用户造成冲突<br />
　　}<br />
　　}<br />
　　<br />
　　void ClientService()<br />
　　{<br />
　　string command;<br />
　　string receiveStr;<br />
　　string fileName,fileSize;<br />
　　Socket sock=clientSocket;<br />
　　EndPoint oldEP=sock.RemoteEndPoint;<br />
　　byte[] bb=new byte[200];<br />
　　while(true)<br />
　　{<br />
　　ii=sock.ReceiveFrom(bb,ref oldEP);//接收数据<br />
　　if(ii==0)//2、客户端连接断开，就会不停接收0个字节<br />
　　{<br />
　　break;<br />
　　}<br />
　　receiveStr=Encoding.Default.GetString(bb,0,bb.Length);<br />
　　command=ReadLineFrom(receiveStr,1).ToLower();//ReadLineFrom读取字符串中的一行数据<br />
　　Switch(command)<br />
　　{<br />
　　cace &#8220;upload&#8220;:<br />
　　fileName=ReadLineFrom(receiveStr,2);<br />
　　fileSize=ReadLineFrom(receiveStr,3);<br />
　　uploadFile(sock,fileName,Int32.Parse(fileSize));//接受数据方法,<br />
　　break;<br />
　　....................<br />
　　}<br />
　　<br />
　　}<br />
　　<br />
　　void uploadFile(Socket sock,string fileName,int fileSize)<br />
　　{<br />
　　int loadSize=0;<br />
　　byte[] bb;<br />
　　int blen=102400;<br />
　　NetworkStream stream=new NetworkStream(sock);<br />
　　FileStream fs=File.OpenWrite(tempstr);<br />
　　while(loadSize<filesize)<br />
　　{<br />
　　if(loadSize&gt;fileSize-102400)<br />
　　blen=fileSize-loadSize;<br />
　　bb=new byte[blen];<br />
　　int ii=stream.Read(bb,0,bb.Length);//3、实际接受数据时每次可能没有10240个字节<br />
　　fs.Write(bb,0,ii);<br />
　　loadSize+=ii;<br />
　　}<br />
　　fs.Close();<br />
　　stream.Close();<br />
　　}<br />
　　<br />
　　1、等待传值给线程中的变量，防止多用户造成冲突<br />
　　<br />
　　2、客户端连接断开，就会不停接收0个字节<br />
　　判断客户端是否断开要用这个方法实现，Sokcet里带的Connected不起作用，只要连接上，中途不出现发送和或接收数据错误，客户断开与否都是返回true。Poll(100,SelectMode...)返回任何模式都是true。<br />
　　<br />
　　3、实际接受数据时每次可能没有10240个字节<br />
　　<br />
　　客户端我就不写了，用TcpClient连接就可以了，当然实际应用中，可能就要自己写规则了<br />
　　<br />
　　这些问题解决了，只要做适当的处理，视频，声音都不是问题了。 
<img src ="http://www.blogjava.net/ebecket/aggbug/310779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-25 20:47 <a href="http://www.blogjava.net/ebecket/archive/2010/01/25/310779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用js获取服务器时间的两个简单方法</title><link>http://www.blogjava.net/ebecket/archive/2010/01/25/310777.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 25 Jan 2010 12:45:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/25/310777.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310777.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/25/310777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310777.html</trackback:ping><description><![CDATA[　有时用js来获取<a class="channel_keylink" href="http://server.chinaitlab.com/" target="_blank">服务器</a>时间。一般会用System.DateTime
<p>　　方法如下：</p>
<p>　　&lt;script language="javascript"&gt;</p>
<p>　　var&nbsp; a&nbsp; =&nbsp; new&nbsp; Date()</p>
<p>　　a&nbsp; =&nbsp; &lt;%=System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")%&gt;;</p>
<p>　　Response.Write(a)</p>
<p>　　&lt;/script&gt;</p>
<p>　　其实还有一个方法：利用javascript的&#8220;runat="server&#8221;属性</p>
<p>　　代码</p>
<p>　　&lt;script runat="server" language="javascript"&gt;</p>
<p>　　var a = new Date();</p>
<p>　　a =a.getFullYear()+ "-"+(a.getMonth()+1)+"-"+a.getDate()+" "+a.getHours()+":"+a.getMinutes();</p>
<p>　　Response.Write(a);</p>
<p>　　&lt;/script&gt;<br />
<br />
<br />
<br />
//可以用同样的方法让JS访问c#代码，如下 </p>
<p>　　/*</p>
<p>　　c#(加)　：</p>
<p>　　using System.Web</p>
<p>　　HttpCookie&nbsp;&nbsp; UserCookie&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; HttpCookie("UserName",UserName);</p>
<p>　　Response.Cookies.Add(UserCookie);</p>
<p>　　(注销)</p>
<p>　　Request.Cookies.Clear();</p>
<p>　　//将Cookies["UserName"]置空</p>
<p>　　HttpCookie&nbsp;&nbsp; customerCookie&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; HttpCookie("UserName",&nbsp;&nbsp; string.Empty);</p>
<p>　　Response.Cookies.Add(customerCookie);</p>
<p>　　JS：</p>
<p>　　function getCookie(objName)</p>
<p>　　{//获取指定名称的cookie的值</p>
<p>　　var arrStr = document.cookie.split("; ");</p>
<p>　　for(var i = 0;i &lt; arrStr.length;i ++)</p>
<p>　　{</p>
<p>　　var temp = arrStr[i].split("=");</p>
<p>　　if(temp[0] == objName) return unescape(temp[1]);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　function delCookie(name)</p>
<p>　　{//为了删除指定名称的cookie，可以将其过期时间设定为一个过去的时间</p>
<p>　　var date = new Date();</p>
<p>　　date.setTime(date.getTime() - 10000);</p>
<p>　　document.cookie = name + "=a; expires=" + date.toGMTString();</p>
<p>　　}</p>
<p>　　*/</p>
<p>　　}</p>
<p>　　}</p>
<p>　　以上两个，是同一个页面的一个是前台一个是后台</p>
<img src ="http://www.blogjava.net/ebecket/aggbug/310777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-25 20:45 <a href="http://www.blogjava.net/ebecket/archive/2010/01/25/310777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javascript和C#之间的互相调用和访问</title><link>http://www.blogjava.net/ebecket/archive/2010/01/25/310778.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 25 Jan 2010 12:45:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/25/310778.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310778.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/25/310778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310778.html</trackback:ping><description><![CDATA[这包括了JS调用c#方法，JS访问<a class="channel_keylink" href="http://dotnet.chinaitlab.com/List_233.html" target="_blank">C#</a>变量，<a class="channel_keylink" href="http://dotnet.chinaitlab.com/List_233.html" target="_blank">C#</a> 调用JS代码，<a class="channel_keylink" href="http://dotnet.chinaitlab.com/List_233.html" target="_blank">C#</a>访问JS变量的各种方法
<p>　　JS代码：</p>
<p>　　&lt;script language="javascript" type ="text/javascript" &gt;</p>
<p>　　var JSVar = "This is JS Code ";</p>
<p>　　function getcsharpstring() {</p>
<p>　　//去调用c#的函数，请注意带参数的写法</p>
<p>　　var mys = '&lt;%=CSharpString("___________This is JS Code ")%&gt;';</p>
<p>　　//没有参数的可以这样写var mys = "&lt;%=CSharpString()%&gt;";</p>
<p>　　alert(mys)</p>
<p>　　}</p>
<p>　　function getcsharpvar() {</p>
<p>　　var mys = '&lt;%= CSharpVar%&gt;';//调问c#中的变量</p>
<p>　　alert(mys)</p>
<p>　　}</p>
<p>　　//此函数用于C#调用</p>
<p>　　function CSharpCall() {</p>
<p>　　alert("这里设置一个ookie ");</p>
<p>　　//设置一个cookie ,在c#读取这个cookie的值来达到访问JS变量</p>
<p>　　document.cookie = "JSVarToCSharp= " + JSVar;</p>
<p>　　}</p>
<p>　　&lt;/script&gt;</p>
<p>　　c#后台代码：</p>
<p>　　public partial class _Default : System.Web.UI.Page</p>
<p>　　{</p>
<p>　　public string CSharpVar = "这是CSharp代码";//C#变量</p>
<p>　　protected void Page_Load(object sender, EventArgs e)</p>
<p>　　{</p>
<p>　　}</p>
<p>　　//被JS调用</p>
<p>　　public string CSharpString(string _string )</p>
<p>　　{</p>
<p>　　return&nbsp; "这是CSharp代码" + _string 　;</p>
<p>　　}</p>
<p>　　protected void Button3_Click(object sender, EventArgs e)</p>
<p>　　{</p>
<p>　　string jsString = "&lt;script&nbsp;&nbsp; language=javascript &gt; CSharpCall() &lt;/script&gt;";</p>
<p>　　Page.RegisterStartupScript("ggg", jsString);//调用JS方法</p>
<p>　　}</p>
<p>　　protected void Button4_Click(object sender, EventArgs e)</p>
<p>　　{</p>
<p>　　//通过读取cookie 来得到JS的变量</p>
<p>　　HttpCookie cookie = Request.Cookies["JSVarToCSharp"];</p>
<p>　　if (cookie != null)</p>
<p>　　{</p>
<p>　　string jsVar = cookie.Value.ToString();</p>
<p>　　}</p>
<img src ="http://www.blogjava.net/ebecket/aggbug/310778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-25 20:45 <a href="http://www.blogjava.net/ebecket/archive/2010/01/25/310778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分享关于ASP.NET中等安全模式的一些经验</title><link>http://www.blogjava.net/ebecket/archive/2010/01/25/310776.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 25 Jan 2010 12:41:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/25/310776.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310776.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/25/310776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310776.html</trackback:ping><description><![CDATA[　如果你正在开发一个通用型的Web产品，比如BBS、CMS、BLOG这类的，那么，建议你阅读以下本篇文章。
<p>　　非通用型的Web程序或产品，通常不会和ASP.NET中等<a class="channel_keylink" href="http://security.chinaitlab.com/" target="_blank">安全</a>模式打交道，因为面对的用户群体会比较固定，或者部署环境是可以由程序提供者决定的。</p>
<p>　　但在做通用型的Web产品的时候，你就要和各种人打交道了，有的站长用的是国外空间，比如GoDaddy，外国的空间商通常会把ASP.NET代码执行权限控制在中等<a class="channel_keylink" href="http://security.chinaitlab.com/" target="_blank">安全</a>模式。</p>
<p>　　而在中等安全模式下，很多我们习以为常的事情都是做不了的。</p>
<p>　　<strong>中等安全模式是什么？</strong></p>
<p>　　可能很多人都没接触过中等安全模式，我在参与bbsmax项目之前，我也不知道有中等安全模式这么个东西。</p>
<p>　　简单来说，ASP.NET提供了一个简单设置代码执行权限的方案，叫做&#8220;信任级别&#8221;。</p>
<p>　　它默认提供5种信任级别，分别是：FullTrust、High、Medium、Low、Minimal。</p>
<p>　　每个信任级别的设置，分别对应于一组代码权限设置。</p>
<p>　　这个方案，让网站部署者可以通过web.config快速设置网站的托管代码执行权限。</p>
<p>　　通过对web.config的&lt;system.web&gt;/&lt;trust&gt;节点的level属性值进行设置，就可以将ASP.NET程序设置到不同的信任级别。</p>
<p>　　ASP.NET安装完，所有网站默认都是FullTrust信任级别，也是最高信任级别。</p>
<p>　　本文说的&#8220;中等安全模式&#8221;就是对应于Medium信任级别。</p>
<p>　　因为托管代码执行权限模型不是本文讨论的重点，所以我这里只做简单的说明，不深入讨论ASP.NET安全级别设置的实现原理，实现原理可以参考本文最后给出的几个连接。</p>
<p>　　<strong>中等安全模式会有哪些影响？</strong></p>
<p>　　以下是我和我的同事在ASP.NET中等安全模式下曾经遇到过的一些问题：</p>
<p>　　1. 基于VirtualPathProvider的模板机制不能用，因为VirtualPathProvider至少需要运行在High模式。</p>
<p>　　2. BuildProvider不能用，意味着你想自己添加自己的语言实现也不能用了，不过大部分项目不会用到这么高级的东西。</p>
<p>　　3. CodeDom、Emit不能用了，这下惨了，什么Ioc、AOP，动态注入的高科技玩意儿，全都废了，这些不是基于CodeDom的就是基于Emit的。</p>
<p>　　4. 通过aspx页面接管文件<a class="channel_keylink" href="http://download.chinaitlab.com/" target="_blank">下载</a>也不行了，Response写文件流到客户端需要更高的代码执行权限。</p>
<p>　　5. 大文件上传也别想了，因为大文件上传万变不离HttpWorkRequst，获取HttpWorkRequst的代码需要FullTrust模式。</p>
<p>　　6. SQLite不能用了，因为中等安全模式下没有非托管代码调用权限，所以除了SQLite外，涉及到非托管代码调用的，也都废掉了。</p>
<p>　　7. Access数据不能用OleDb连接了，因为中等安全模式下，OleDbClient是不能用的，你只能用ODBC数据源。</p>
<p>　　所以，如果要考虑允许让用户把程序部署到中等安全模式下，那就越早做中等安全模式的兼容性<a class="channel_keylink" href="http://softtest.chinaitlab.com/" target="_blank">测试</a>越好。</p>
<p>　　因为很多不能用的东西，都是涉及到基础结构的。</p>
<p>　　比如，SQLite和Access不能用，你的程序如果正巧就只做这两个数据库的版本，咋办？</p>
<p>　　比如，文件<a class="channel_keylink" href="http://download.chinaitlab.com/" target="_blank">下载</a>不能通过Response写文件流的方式，你的程序正巧又是这么做防盗链，咋办？</p>
<p>　　<strong>中等安全模式要求那么苛刻，怎么对付？</strong></p>
<p>　　只能绕道走了，要不然怎么办？方法还是有的，得不断尝试。</p>
<p>　　VirtualPathProvider不能用，BuildProvider也不能用，但是又需要有自己的一套模板语法。那只好在页面访问前生成aspx页面，再做URL重写了。</p>
<p>　　说起来很简单，就一句话。但是这中间我不知道写了多少代码，做了多少次试验，才找到最佳方案。</p>
<p>　　所以，你的方法还是得你自己找。</p>
<p>　　以下是判断程序是否运行在中等安全模式的代码：</p>
<p>　　if (SecurityManager.IsGranted(new AspNetHostingPermission(AspNetHostingPermissionLevel.Medium)))</p>
<p>　　{</p>
<p>　　}</p>
<p>　　如果有遇到不是必须执行的逻辑，比如获取程序内存占用率或者大文件上传，那就可以先判断下，再决定是否调用。</p>
<p>　　根据资料显示，把程序集部署到GAC中，可以获得FullTrust级别的权限，不过我没有实际试过。</p>
<img src ="http://www.blogjava.net/ebecket/aggbug/310776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-25 20:41 <a href="http://www.blogjava.net/ebecket/archive/2010/01/25/310776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>130道ASP.NET面试题</title><link>http://www.blogjava.net/ebecket/archive/2010/01/25/310774.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 25 Jan 2010 12:38:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/25/310774.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310774.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/25/310774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310774.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;1. 简述 private、 protected、 public、 internal 修饰符的访问权限。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 答 . private : 私有成员, 在类的内部才可以访问。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected : 保护成员，该类内部...&nbsp;&nbsp;<a href='http://www.blogjava.net/ebecket/archive/2010/01/25/310774.html'>阅读全文</a><img src ="http://www.blogjava.net/ebecket/aggbug/310774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-25 20:38 <a href="http://www.blogjava.net/ebecket/archive/2010/01/25/310774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net程序员笔试题(转) </title><link>http://www.blogjava.net/ebecket/archive/2010/01/25/310770.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Mon, 25 Jan 2010 12:19:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/25/310770.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310770.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/25/310770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310770.html</trackback:ping><description><![CDATA[<h1 class="postTitle"><a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/pengpengsay/archive/2008/02/27/1083225.html">.net程序员笔试题(转)</a> </h1>
<div class="clear"></div>
<div class="postBody">
<p style="text-align: left; text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt" align="left">1、&nbsp;<span style="font-family: Tahoma">a=999,b=333</span><span style="font-family: 宋体">，在不用第三方变题的前提下，把它们的值互换？</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="color: #101010">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; color: #101010">目的：考察对基础知识的掌握。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="font-family: 宋体">b)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">采用线性算法，</span><span style="font-family: Tahoma">a = a + b </span><span style="font-family: 宋体">；</span><span style="font-family: Tahoma">b = a &#8211; b ; a= a - b.</span></p>
<p style="text-align: left; text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt" align="left"><span style="color: #101010">2、&nbsp;</span><span style="font-family: 宋体; color: #101010">简述</span><span style="color: #101010"> private</span><span style="font-family: 宋体; color: #101010">、</span><span style="color: #101010"> protected</span><span style="font-family: 宋体; color: #101010">、</span><span style="color: #101010"> public</span><span style="font-family: 宋体; color: #101010">、</span><span style="color: #101010"> internal </span><span style="font-family: 宋体; color: #101010">修饰符的访问权限。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="color: #101010">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; color: #101010">目的：考察对基础知识的掌握。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="color: #101010">b)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: #101010">private : </span><span style="font-family: 宋体; color: #101010">私有成员</span><span style="color: #101010">, </span><span style="font-family: 宋体; color: #101010">在类的内部才可以访问。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="color: #101010">c)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: #101010">protected : </span><span style="font-family: 宋体; color: #101010">保护成员，该类内部和继承类中可以访问。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="color: #101010">d)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: #101010">public : </span><span style="font-family: 宋体; color: #101010">公共成员，完全公开，没有访问限制。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="font-family: Tahoma">e)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: #101010">internal: </span><span style="font-family: 宋体; color: #101010">在同一命名空间内可以访问。</span></p>
<p style="text-align: left; text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt" align="left"><span style="color: #101010">3、&nbsp;</span><span style="color: #101010">ASP.NET </span><span style="font-family: 宋体; color: #101010">页面之间传递值的几种方式。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="font-family: Tahoma">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Tahoma">1.</span><span style="font-family: 宋体">使用</span><span style="font-family: Tahoma">QueryString, </span><span style="font-family: 宋体">如</span><span style="font-family: Tahoma">....?id=1; response. Redirect().... </span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="font-family: Tahoma">b)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Tahoma">2.</span><span style="font-family: 宋体">使用</span><span style="font-family: Tahoma">Session</span><span style="font-family: 宋体">变量</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="font-family: Tahoma">c)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: Tahoma">3.</span><span style="font-family: 宋体">使用</span><span style="font-family: Tahoma">Server.Transfer</span></p>
<p style="text-align: left; text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt" align="left"><span style="color: #101010">4、&nbsp;</span><span style="font-family: 宋体; color: #101010">用</span><span style="color: #101010">.net</span><span style="font-family: 宋体; color: #101010">做</span><span style="color: #101010">B/S</span><span style="font-family: 宋体; color: #101010">结构的系统，您是用几层结构来开发，每一层之间的关系以及为什么要这样分层？</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">一般为</span>3<span style="font-family: 宋体">层</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">b)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">数据访问层，业务层，表示层。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">c)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">数据访问层对数据库进行增删查改。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">d)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">业务层一般分为二层，业务表观层实现与表示层的沟通，业务规则层实现用户密码的安全等。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">e)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">表示层为了与用户交互例如用户添加表单。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">f)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">优点：</span><span style="font-family: 宋体">分工明确，条理清晰，易于调试，而且具有可扩展性。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">g)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">缺点：</span><span style="font-family: 宋体">增加成本。</span></p>
<p style="text-align: left; text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt" align="left"><span style="color: #101010">5、&nbsp;</span><span style="font-family: 宋体; color: #101010">写出一条</span><span style="color: #101010">Sql</span><span style="font-family: 宋体; color: #101010">语句：取出表</span><span style="color: #101010">A</span><span style="font-family: 宋体; color: #101010">中第</span><span style="color: #101010">1000</span><span style="font-family: 宋体; color: #101010">到第</span><span style="color: #101010">1099</span><span style="font-family: 宋体; color: #101010">记录（</span><span style="color: #101010">SQLServer,</span><span style="font-family: 宋体; color: #101010">以自动增长的</span><span style="color: #101010">ID</span><span style="font-family: 宋体; color: #101010">作为主键</span><span style="color: #101010">,</span><span style="font-family: 宋体; color: #101010">注意：</span><span style="color: #101010">ID</span><span style="font-family: 宋体; color: #101010">可能不是连续的。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">解</span>1: select top 99 * from A where id not in (select top 1000 id from A) <span style="font-family: 宋体">，对</span>SQL<span style="font-family: 宋体">基本理论、语法是否熟悉！</span></p>
<p style="text-align: left; text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt" align="left">6、&nbsp;<span style="font-family: 宋体">写出程序的输出结果：</span></p>
<p style="text-align: left; margin-left: 52.5pt" align="left">public class A<span style="font-family: 宋体">　</span></p>
<p style="text-align: left; margin-left: 52.5pt" align="left">{ </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　</span>public virtual void Fun1(int i) </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　</span> { </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　　　</span>Console.WriteLine(i); </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　</span>} </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　</span>public void Fun2(A a)<span style="font-family: 宋体">　</span></p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　</span> { </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　　　</span>a.Fun1(1); </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　　　</span>Fun1(5); </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　</span>} </p>
<p style="text-align: left; margin-left: 52.5pt" align="left">} </p>
<p style="text-align: left; margin-left: 52.5pt" align="left">public class B : A<span style="font-family: 宋体">　</span></p>
<p style="text-align: left; margin-left: 52.5pt" align="left">{ </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　</span>public override void Fun1(int i)<span style="font-family: 宋体">　　</span></p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　</span> { </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　　　</span>base.Fun1 (i + 1); </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　</span>} </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　</span>public static void Main()<span style="font-family: 宋体">　</span></p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　</span> { </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　　　</span>B b = new B(); </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　　　</span>A a = new A(); </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　　　</span>a.Fun2(b); </p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　　　</span>b.Fun2(a);<span style="font-family: 宋体">　　　　　</span></p>
<p style="text-align: left; margin-left: 52.5pt" align="left"><span style="font-family: 宋体">　　　　</span>} </p>
<p style="text-align: left; margin-left: 52.5pt" align="left">}</p>
<p style="text-align: left" align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">考查在继承类中构造函数</span>, <span style="font-family: 宋体">以及</span>new <span style="font-family: 宋体">方法。</span>2 <span style="font-family: 宋体">、</span>5 <span style="font-family: 宋体">、　</span>1 <span style="font-family: 宋体">、</span>6</p>
<p style="text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt"><span style="color: #574d31">7、&nbsp;</span><span style="font-family: Georgia; color: #574d31">C#</span><span style="font-family: 宋体; color: #574d31">中，</span><span style="font-family: Georgia; color: #574d31">string&nbsp;str&nbsp;=&nbsp;null&nbsp;</span><span style="font-family: 宋体; color: #574d31">与</span><span style="font-family: Georgia; color: #574d31">&nbsp;string&nbsp;str&nbsp;=""</span><span style="font-family: 宋体; color: #574d31">，请尽量用文字说明区别。</span></p>
<p style="text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Georgia; color: #574d31">string&nbsp;str&nbsp;=""&nbsp;</span><span style="font-family: 宋体; color: #574d31">分配空间而</span><span style="font-family: Georgia; color: #574d31">string str = null</span><span style="font-family: 宋体; color: #574d31">不分配空间。</span></p>
<p style="text-align: left; text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt" align="left"><span style="color: #101010">8、&nbsp;</span><span style="color: #101010">Session</span><span style="font-family: 宋体; color: #101010">有什么重大</span><span style="color: #101010">BUG</span><span style="font-family: 宋体; color: #101010">，有什么方法加以解决？</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #101010">是</span><span style="color: #101010">iis</span><span style="font-family: 宋体; color: #101010">中由于有进程回收机制，系统繁忙的话</span><span style="color: #101010">Session</span><span style="font-family: 宋体; color: #101010">会丢失，可以用</span><span style="color: #101010">Sate server</span><span style="font-family: 宋体; color: #101010">或</span><span style="color: #101010">SQL Server</span><span style="font-family: 宋体; color: #101010">数据库的方式存储</span><span style="color: #101010">Session</span><span style="font-family: 宋体; color: #101010">不过这种方式比较慢，而且无法捕获</span><span style="color: #101010">Session</span><span style="font-family: 宋体; color: #101010">的</span><span style="color: #101010">END</span><span style="font-family: 宋体; color: #101010">事件。</span></p>
<p style="text-align: left; text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt" align="left"><span style="color: #101010">9、&nbsp;</span><span style="font-family: 宋体; color: #101010">简要谈一下您对</span><span style="color: #101010">.NET </span><span style="font-family: 宋体; color: #101010">构架下</span><span style="color: #101010">remoting</span><span style="font-family: 宋体; color: #101010">和</span><span style="color: #101010">webservice</span><span style="font-family: 宋体; color: #101010">两项技术的理解以及实际中的应用。</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #101010">WS</span><span style="font-family: 宋体; color: #101010">主要是可利用</span><span style="color: #101010">HTTP</span><span style="font-family: 宋体; color: #101010">，穿透防火墙。而</span><span style="color: #101010">Remoting</span><span style="font-family: 宋体; color: #101010">可以利用</span><span style="color: #101010">TCP/IP</span><span style="font-family: 宋体; color: #101010">，二进制传送提高效率。</span></p>
<p style="text-align: left; text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt" align="left">10、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #101010">try {}</span><span style="font-family: 宋体; color: #101010">里有一个</span><span style="color: #101010">return</span><span style="font-family: 宋体; color: #101010">语句，那么紧跟在这个</span><span style="color: #101010">try</span><span style="font-family: 宋体; color: #101010">后的</span><span style="color: #101010">finally {}</span><span style="font-family: 宋体; color: #101010">里的代码会不会被执行，什么时候被执行</span><span style="color: #101010">?</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #101010">会执行，在</span><span style="color: #101010">return</span><span style="font-family: 宋体; color: #101010">前执行。</span></p>
<p style="text-align: left; text-indent: -18pt; margin-left: 27pt; tab-stops: list 27.0pt" align="left">11、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: Arial">abstract class</span><span style="font-family: 宋体">和</span><span style="font-family: Arial">interface</span><span style="font-family: 宋体">有什么区别</span><span style="font-family: Arial">?</span></p>
<p style="text-align: left; text-indent: -21pt; margin-left: 57.75pt; tab-stops: list 57.75pt" align="left"><span style="font-family: Arial">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">声明方法的存在而不去实现它的类被叫做抽像类（</span><span style="font-family: Arial">abstract class</span><span style="font-family: 宋体">），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建</span><span style="font-family: Arial">abstract </span><span style="font-family: 宋体">类的实例。然而可以创建一个变量，其类型是一个抽像类，并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。</span><span style="font-family: Arial">Abstract </span><span style="font-family: 宋体">类的子类为它们父类中的所有抽像方法提供实现，否则它们也是抽像类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。</span><span style="font-family: Arial"> <br />
</span><span style="font-family: 宋体">接口（</span><span style="font-family: Arial">interface</span><span style="font-family: 宋体">）是抽像类的变体。在接口中，所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的，没有一个有程序体。接口只可以定义</span><span style="font-family: Arial">static final</span><span style="font-family: 宋体">成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，</span><span style="font-family: Arial">instanceof </span><span style="font-family: 宋体">运算符可以用来决定某对象的类是否实现了接口。</span></p>
<p style="text-align: left" align="left"><span style="font-family: Arial">12</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">每次我们请求一个</span><span style="font-family: Tahoma">asp.net</span><span style="font-family: 宋体">页面时，我们都经历着同样的过程</span><span style="font-family: Tahoma">,</span><span style="font-family: 宋体">我们称它为</span><span style="font-family: Tahoma">asp.net</span><span style="font-family: 宋体">页面生命周期！</span><span style="font-family: 宋体">每个页面的生命周期为用户的每一次访问，也就是说每一次客户端与服务器之间的一个往返过程</span><span style="font-family: ˎ̥">.</span><span style="font-family: 宋体">请你说一说这个过程它们都发生了那些事件？</span></p>
<p style="text-align: left; margin-left: 33.75pt" align="left"><span style="font-family: 宋体">目的：是否从根本去了解页面是如何来的。</span><span style="font-family: ˎ̥"><br />
1. Page_Init();<br />
2. Load ViewState and Postback data;<br />
3. Page_Load();<br />
4. Handle control events;<br />
5. Page_PreRender();<br />
6. Page_Render();<br />
7. Unload event;<br />
8. Dispose method called;</span></p>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/310770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-25 20:19 <a href="http://www.blogjava.net/ebecket/archive/2010/01/25/310770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>任意类型转换成json</title><link>http://www.blogjava.net/ebecket/archive/2010/01/20/310169.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 19 Jan 2010 17:46:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/20/310169.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310169.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/20/310169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310169.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 任意类型转换成json 项目中经常要用到json格式的数据，把收集和整理的转换json数据的方法发布如下：在.net framework2.0中，没有JavaScriptSerializer（3.0）&nbsp;和DataContractJsonSerializer&nbsp;（3.5），所以经常要用手写的转换类，这样调试也方便些，何况JavaScriptSerializer&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/ebecket/archive/2010/01/20/310169.html'>阅读全文</a><img src ="http://www.blogjava.net/ebecket/aggbug/310169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-20 01:46 <a href="http://www.blogjava.net/ebecket/archive/2010/01/20/310169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpHandler HttpModule入门篇</title><link>http://www.blogjava.net/ebecket/archive/2010/01/20/310168.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 19 Jan 2010 17:45:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/20/310168.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310168.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/20/310168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310168.html</trackback:ping><description><![CDATA[<h1 class="postTitle"><a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/cyan/archive/2009/02/04/1383580.html">HttpHandler HttpModule入门篇</a> </h1>
<div class="clear"></div>
<div class="postBody">
<div class="tit">&nbsp;</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div id="blog_text" class="cnt">
            <p>ASP.Net处理Http Request时，使用Pipeline（管道）方式，由各个HttpModule对请求进行处理，然后到达 HttpHandler，HttpHandler处理完之后，仍经过Pipeline中各个HttpModule的处理，最后将HTML发送到客户端浏览 器中。</p>
            <p>生命周期中涉及到几个非常重要的对象：HttpHandler,HttpModule,IHttpHandlerFactory，他们的执行(顺序)大致的执行过程是这样的：client端发送页面请求，被IIS的某个进程截获，它根据申请的页 面后缀(.aspx)不同，调用不同的页面处理程序(.asp-&gt;asp.dll; .aspx-&gt;ISAPI.dll).而页面处理程序在处理过程中，则要经历HttpModule,HttpHandler的处理：前者<font color="#ff0000">HttpModule用于页面处理前和处理后的一些事件的处理</font>，<font color="#ff0000">后者HttpHandler进行真正的页面的处理</font>。<br />
            如前所说，HttpModule会在页面处理前和后对页面进行处理，所以它不会影响真正的页面请求。通常用在给每个页面的头部或者尾部添加一些信息（如版 权声明）等.曾经见过一些免费的空间，我们的页面上传上去后，浏览的时候发现，在每个页面的头部和尾部多了很多小广告....,如果理解了 HttpModule的原理，要做这个就不是很难了~</p>
            <p><br />
            IHttpModule与IHttpHandler的区别整理<br />
            1.先后次序.先IHttpModule,后IHttpHandler. <font color="#ff0000">注:</font>Module要看你响应了哪个事件，一些事件是在Handler之前运行的，一些是在Handler之后运行的<br />
            2.对请求的处理上:<br />
            &nbsp;&nbsp;&nbsp;IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.<br />
            &nbsp;&nbsp;&nbsp;IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.<br />
            3.IHttpHandler按照你的请求 生成响应的内容，IHttpModule对请求进行预处理，如验证、修改、过滤等等，同时也可以对响应进行处理</p>
            <p>&nbsp;</p>
            <p>ASP.Net系统本身配置有很多HttpHandler和HttpModule，以处理aspx等.Net标准的页面文件，以及这些页面文件中标 准的事件处理等。查看%System%/Microsoft.NET\Framework\v2.0.50727\CONFIG目录下的 web.config文件中的httpHandlers和httpModules节点，可以看到这些配置。如果有兴趣，可以使用Reflector查 看.Net系统中相关的类和方法，了解.Net如何处理以及做了什么处理。</p>
            <p>.Net也提供了一套机制来开发自定义的HttpHandler和 HttpModule，均可以用于对HttpRequest的截取，完成自定义的处理。 HttpModule 继承System.Web.IHttpModule接口，实现自己的HttpModule类。必须要实现接口的两个方法：Init和Dispose。在 Init中，可以添加需要截取的事件；Dispose用于资源的释放，如果在Init中创建了自己的资源对象，请在Dispose中进行释放。</p>
            <p>&nbsp;</p>
            <div class="cnblogs_code"><img style="display: none" id="Code_Closed_Image_092931" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_092931').style.display='none'; document.getElementById('Code_Open_Image_092931').style.display='inline'; document.getElementById('Code_Open_Text_092931').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"  alt="" /><img style="display: inline" id="Code_Open_Image_092931" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_092931').style.display='none'; getElementById('Code_Closed_Image_092931').style.display='inline'; getElementById('Code_Closed_Text_092931').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"  alt="" /><span style="display: none" id="Code_Closed_Text_092931" class="cnblogs_code_Collapse">Code</span><span style="display: inline" id="Code_Open_Text_092931"><br />
            <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;MyModule<br />
            {<br />
            &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyHttpModule&nbsp;:&nbsp;IHttpModule<br />
            &nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MyHttpModule()<br />
            &nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Init方法用来注册HttpApplication&nbsp;事件。</span><span style="color: #008000"><br />
            </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Init(HttpApplication&nbsp;r_objApplication)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r_objApplication.BeginRequest&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;EventHandler(</span><span style="color: #0000ff">this</span><span style="color: #000000">.BeginRequest);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Dispose()<br />
            &nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;BeginRequest(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;r_objSender,&nbsp;EventArgs&nbsp;r_objEventArgs)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpApplication&nbsp;objApp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(HttpApplication)r_objSender;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objApp.Response.Write(</span><span style="color: #800000">"</span><span style="color: #800000">您请求的URL为</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;objApp.Request.Path);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;}<br />
            }&nbsp;&nbsp;&nbsp;<br />
            <br />
            </span></span></div>
            <p><br />
            &nbsp;</p>
            <p>将编译的dll文件拷贝到web项目的bin目录下，在web项目的web.config文件system.web节点中配置： <br />
            &nbsp;&nbsp;&nbsp; 这样就将自定义的HttpModule类MyHttpModule插入到了当前web的HttpModule的Pipeline中。 <font color="#ff0000">HttpModule</font>主要功能是<font color="#ff0000">对</font>Application的<font color="#ff0000">各个事件进行截取</font>，在这些事件中完成自己的处理。其实如果自己开发一些项目，直接在 <font color="#ff0000">Global.asax</font>中处理已经足够了。如果是开发一个Framework或者是某些方面的组件，需要在事件中添加处理，开发自定义的 HttpModule，可以避免使用Framework或者组件时，还得手工在Global.asax中添加代码。&nbsp;&nbsp;&nbsp;&nbsp; 目前想到的开发自定义HttpModule的用途，有全局的身份/权限验证、自定义网站访问/操作日志的记录、处于管理/调试等目的对站点进行监控追踪 等。当然，如果是结合自定义的HttpHandler进行Framework的开发，HttpModule可以用于其它的一些特殊的处理。</p>
            <p>&nbsp;&nbsp; &nbsp;&nbsp; &lt;httpModules&gt;<br />
            &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &lt;add name="test" type="MyHttpModuleTest.MyHttpModule,MyHttpModule"/&gt;<br />
            &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/httpModules&gt;<br />
            &nbsp;&nbsp; 注意要区分大小写，因为web.config作为一个XML文件是大小写敏感的。&#8220;type=MyHttpModuleTest.MyHttpModule,MyHttpModule&#8221;告诉我们系统将会将http request请求交给位于MyHttpModule.dll文件中的MyHttpModuleTest.MyHttpModule类去处理。HttpHandler是完全的对Http Request的截取。<br />
            &nbsp;&nbsp;&nbsp; 首先，继承System.Web.IHttpHandler接口，实现自己的HttpHandler类。必须要实现接口的ProcessRequest方 法和IsReusable属性。ProcessRequest方法中完成对每个Http Request的处理，发送处理结果的HTML到输出缓存中。IsReusable属性被.Net Framework调用，用以确定这个HttpHandler的实例是否可以被重用于同类型其它的Request处理。<br />
            &nbsp;&nbsp;&nbsp; 如果你在自己的HttpHandler类中，需要读取或者是写Session值，需要再继承一个接口IRequiresSessionState。这个接 口没有任何方法，只是一个标记接口。继承这个接口之后，就可以在自己的HttpHandler中访问Session，可以在Session中写入值。<br />
            </p>
            <div class="cnblogs_code"><img style="display: none" id="Code_Closed_Image_093213" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_093213').style.display='none'; document.getElementById('Code_Open_Image_093213').style.display='inline'; document.getElementById('Code_Open_Text_093213').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"  alt="" /><img style="display: inline" id="Code_Open_Image_093213" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_093213').style.display='none'; getElementById('Code_Closed_Image_093213').style.display='inline'; getElementById('Code_Closed_Text_093213').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"  alt="" /><span style="display: none" id="Code_Closed_Text_093213" class="cnblogs_code_Collapse">Code</span><span style="display: inline" id="Code_Open_Text_093213"><br />
            <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;MyHandler<br />
            {<br />
            &nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyHttpHandler&nbsp;:&nbsp;IHttpHandler,&nbsp;IRequiresSessionState<br />
            &nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MyHttpHandler()&nbsp;{}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;IsReusable<br />
            &nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ProcessRequest(HttpContext&nbsp;context)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpResponse&nbsp;objResponse&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;context.Response&nbsp;;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objResponse.Write(</span><span style="color: #800000">"</span><span style="color: #800000">This&nbsp;request&nbsp;is&nbsp;handled&nbsp;by&nbsp;MyHttpHandler</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            &nbsp;&nbsp;}<br />
            }<br />
            </span></span></div>
            <p>&nbsp;</p>
            <p>&nbsp;&nbsp;&nbsp; 把编译的dll文件拷贝到web项目的bin目录下。<br />
            &nbsp;&nbsp;&nbsp; 接下来，这样来测试一下MyHttpHandler。我们为IIS配置一个以.cc为后缀名的文件类型，用我们写的MyHttpHandler来处理。<br />
            &nbsp;&nbsp;&nbsp; 首先，在IIS站点的Configuration配置里面，添加一个对.cc后缀名处理的Application Extention Mapping项。&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp; 然后，在web项目的web.config节点节点中配置：</p>
            <p>MyHttpHandler, MyHandler"/&gt;</p>
            <p>&nbsp;&nbsp;&nbsp; verb属性配置这个HttpHandler处理那些HTTP方法，例如GET、POST等，如果是处理所有方法，就用*。path属性配置HttpHandler对哪些文件进行处理，例如可以是myfile.cc，如果是处理所有的.cc文件，就用*.cc。<br />
            &nbsp;&nbsp;&nbsp; 这样，这个站点上所有.cc类型文件的访问，都由MyHttpHandler处理。使用<a href="http://localhost/">http://localhost/</a>站点虚拟目录/a.cc访问测试站点，可以看到测试效果。当然，a.cc这个文件在Web服务器上是并不存在的。</p>
            <p>&nbsp;&nbsp;&nbsp; 对HttpHandler的使用，比较典型的有.Net的Web MVC开源项目Maverick。Maverick使用一个Dispatcher类对所有的Http Request进行截取，他以.m作为后缀名向Web服务器提交请求，在Dispatcher中，将.m的后缀去掉，提取Command Name，然后以这个command name从配置文件中加载处理的flow，形成一个chain，依次对chain上的各个command和view进行处理，对各个command和 view的处理结果可能会在chain中选择不同的处理分支，每个处理的Step中将处理结果的HTML写入Response的缓存中进行输出。<br />
            &nbsp;&nbsp;&nbsp; 总体来说，Maverick的框架架构概念很不错，但也存在明显的缺陷，以后有时间再详细的写写它的架构和需要改进之处。</p>
            <p>&nbsp;&nbsp;&nbsp; 总之，将HttpModule、HttpHandler，以及使用Ajax等将客户端进行封装结合起来，能够给web项目的开发带来非常大的改善空间。</p>
            <p>Asp.Net HttpHandler实现URL重写的<br />
            我们经常看到很多网站访问文章的时候才用的是***.html 或***.shtml (如本blog的日志访问效果)，其时这写文件在服务器上不存在的，那为什么会出现这样的效果呢，是因为Web服务器上对URL执行了重写，把访问的 URL根据特定的格式重写成内部访问页面来实现的，它的好处是便于用户理解，同时搜索引擎也能更好地收入你的网站，当然其它的好处也很多，这里不做一一介 绍了。 <br />
            本文所讲的是使用Asp.Net中的HttpHandler实现URL重写的，它所实现的原理请看这里，本程序可以处理任何Url，因为我在程序中使用了URL过虑，只有访问文件名是数字的才进行处理，并指在内部执行一个新的页面，并输出数据，代码如下：<br />
            </p>
            <div class="cnblogs_code"><img style="display: none" id="Code_Closed_Image_093421" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_093421').style.display='none'; document.getElementById('Code_Open_Image_093421').style.display='inline'; document.getElementById('Code_Open_Text_093421').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"  alt="" /><img style="display: inline" id="Code_Open_Image_093421" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_093421').style.display='none'; getElementById('Code_Closed_Image_093421').style.display='inline'; getElementById('Code_Closed_Text_093421').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"  alt="" /><span style="display: none" id="Code_Closed_Text_093421" class="cnblogs_code_Collapse">Code</span><span style="display: inline" id="Code_Open_Text_093421"><br />
            <!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ProcessRequest(HttpContext&nbsp;Context)<br />
            {&nbsp;&nbsp;&nbsp;&nbsp;<br />
            </span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;<br />
            {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">申明Request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
            </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;HttpRequest&nbsp;Request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Context.Request;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">取来路Url的绝对路径&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
            </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Request.Url.AbsolutePath;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">取访问的Web文件的开始字符间隔数</span><span style="color: #008000"><br />
            </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;RegStart&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Url.LastIndexOf(</span><span style="color: #800000">"</span><span style="color: #800000">/</span><span style="color: #800000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">申明一个确定Web文件名是否全是数字</span><span style="color: #008000"><br />
            </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Regex&nbsp;Reg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Regex(</span><span style="color: #800000">@"</span><span style="color: #800000">\d+</span><span style="color: #800000">"</span><span style="color: #000000">);&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用正则表达式进行匹配&nbsp;</span><span style="color: #008000"><br />
            </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(Reg.IsMatch(Url,&nbsp;RegStart))&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果web文件名是数字，则判定是查询相关文章，执行指定页面&nbsp;</span><span style="color: #008000"><br />
            </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Context.Server.Execute(</span><span style="color: #800000">"</span><span style="color: #800000">~/PermaLink.aspx?id=</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;Reg.Match(Url,&nbsp;RegStart).Value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            }&nbsp;&nbsp;&nbsp;&nbsp;<br />
            }<br />
            </span><span style="color: #0000ff">catch</span><span style="color: #000000"><br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.Response.Redirect(Context.Request.Url.ToString());&nbsp;<br />
            }<br />
            }</span></span></div>
            <p><br />
            当然你首先要做的是先建一个类，并继承自IHttpHandler，然后把这段代码拷入，并编译。在Web项目中若要使用此功能，需要在web.config里面加上如下语句：<br />
            &lt;httpHandlers&gt;<br />
            &nbsp;&nbsp;&nbsp; &lt;add verb="*" path="*.shtml" type="HttpHandle.UrlRewrite" /&gt;<br />
            &lt;/httpHandlers&gt;<br />
            同时，还要在IIS中对Web项目进行配置，在Web项目的属性中，在主目录选项卡里，把执行权限改为"脚本和可执行文件"，然后打开配置，在应用程序扩展里加上需重写的文件格式的扩展，好了，成事具备，只欠运行了。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<div id="MySignature">每天进步一点点</div>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/310168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-20 01:45 <a href="http://www.blogjava.net/ebecket/archive/2010/01/20/310168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于HttpModule</title><link>http://www.blogjava.net/ebecket/archive/2010/01/20/310167.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 19 Jan 2010 17:44:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/20/310167.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310167.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/20/310167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310167.html</trackback:ping><description><![CDATA[<h1 class="postTitle"><a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/Monday/archive/2008/01/16/1040876.html">
<h1 class="postTitle"></a><a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/Monday/archive/2008/01/16/1040876.html">关于HttpModule</a><a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/Monday/archive/2008/01/16/1040876.html"></h1>
<br />
这几天在看一个项目,非常有感触.觉得自己知道的还是太少,需要学习的东西也非常之多.其实很多底层的东西应该多去了解,这样对于自己开发一个应用系统以及开发的模式会有很大的帮助,就比如系统权限方面,以前自己写的权限这块看来真的是小儿科,而今看到了利用HttpModule来配合权限的编写,又让我好好的学习了一把,在网上找到对于HttpModule的一些基础解释,先转发过来,供自己和一些路过的朋友参考.<br />
<br />
<br />
--------------------<br />
来源：赛迪网&nbsp; 作者：孙亚民<br />
<br />
ASP.Net中自定义Http处理及应用之HttpModule篇<br />
<br />
HttpHandler实现了类似于ISAPI Extention的功能，他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。而HttpModule实现了类似于ISAPI Filter的功能。 <br />
<br />
<center><font color="#000099"><strong>HttpModule的实现</strong></font></center><br />
<br />
HttpModules实现了类似于ISAPI Filter的功能，在开发上，通常需要经过以下步骤： <br />
<br />
1.编写一个类，实现IhttpModule接口 <br />
<br />
2.实现Init 方法，并且注册需要的方法 <br />
<br />
3.实现注册的方法 <br />
<br />
4.实现Dispose方法，如果需要手工为类做一些清除工作，可以添加Dispose方法的实现，但这不是必需的，通常可以不为Dispose方法添加任何代码。 <br />
<br />
5.在Web.config文件中，注册您编写的类 <br />
<br />
下面是一个HttpModules的示例，在这个示例中，只是简单的注册了HttpApplication 的BeginRequest 和 EndRequest事件，并且通过这些事件的实现方法，将相关的信息打印出来。 <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>例1：
            using System;
            using System.Web;
            namespace MyModule
            {
            public class MyModule : IHttpModule
            {
            public void Init(HttpApplication application)
            {
            application.BeginRequest += (new
            EventHandler(this.Application_BeginRequest));
            application.EndRequest += (new
            EventHandler(this.Application_EndRequest));
            }
            private void Application_BeginRequest(Object source, EventArgs e)
            {
            HttpApplication Application = (HttpApplication)source;
            HttpResponse Response=Application.Context.Response;
            Response.Write("&lt;h1&gt;Beginning of Request&lt;/h1&gt;&lt;hr&gt;");
            }
            private void Application_EndRequest(Object source, EventArgs e)
            {
            HttpApplication application = (HttpApplication)source;
            HttpResponse Response=Application.Context.Response;
            Response.Write("&lt;h1&gt;End of Request&lt;/h1&gt;&lt;hr&gt;");
            }
            public void Dispose()
            {
            }
            }
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
程序的开始引用了如下名称空间： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>using System;
            using System.Web;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
因为HttpApplication、HttpContext、HttpResponse等类在System.Web中定义，因此，System.Web名称空间是必须引用的。 <br />
<br />
MyModule类实现了IhttpModule接口。在Init方法中，指明了实现BeginRequest 和EndRequest 事件的方法。在这两个方法中，只是简单的分别打印了一些信息。 <br />
<br />
下面，在Web.config文件中注册这个类，就可以使用这个HttpModule了，注册的方法如下： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>&lt;configuration&gt;
            &lt;system.web&gt;
            &lt;httpModules&gt;
            &lt;add name=" MyModule " type=" MyModule, MyModule" /&gt;
            &lt;/httpModules&gt;
            &lt;/system.web&gt;
            &lt;/configuration&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
现在来看一下效果。编写一个Aspx页面test.aspx，内容如下： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>&lt;%
            Response.Write("&lt;h1&gt;This is the Page&lt;/h1&gt;&lt;hr&gt;");
            %&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
运行以后的界面如图所示： <br />
<br />
<center><img alt="" src="file:///F:/网站开发/MyProject/收集的学习资料/ASP_Net中自定义Http处理及应用之HttpModule篇.files/55216.gif" /></center><br />
<br />
<center><font color="#000099"><strong>深入研究HttpModule</strong></font></center><br />
<br />
HttpModule通过对HttpApplication对象的一系列事件的处理来对HTTP处理管道施加影响，这些事件在HttpModule的Init方法中进行注册，包括： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>BeginRequest
            AuthenticateRequest
            AuthorizeRequest
            ResolveRequestCache
            AcquireRequestState
            PreRequestHandlerExecute
            PostRequestHandlerExecute
            ReleaseRequestState
            UpdateRequestCache
            EndRequest</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
其中部分事件同Global.asax中的事件相对应，对应关系如下： <br />
<br />
<center><ccid_nobr>
<table class="content" border="1" width="502">
    <tbody>
        <tr>
            <td>HttpModule</td>
            <td>Global.asax</td>
        </tr>
        <tr>
            <td>BeginRequest</td>
            <td>Application_BeginRequest</td>
        </tr>
        <tr>
            <td>AuthenticateRequest</td>
            <td>Application_AuthenticateRequest</td>
        </tr>
        <tr>
            <td>EndRequest</td>
            <td>Application_EndRequest</td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center><br />
<br />
在例1中，处理了BeginRequest和EndRequest事件，其他事件的处理方式基本上类似。 <br />
<br />
同HttpHandler对应来看，这些事件，有些在HttpHandler之前发生，有些在HttpHandler处理完后发生。了解事件发生的顺序非常重要，因为，服务器端的对象在不同的时间段有着不同的表现。例子之一是Session的使用。不是所有的事件中都能对Session进行处理，而只能在有限的几个事件中进行处理。详细的过程可以参考下面的HTTP Request处理生命周期图。 <br />
<br />
<center><img alt="" src="file:///F:/网站开发/MyProject/收集的学习资料/ASP_Net中自定义Http处理及应用之HttpModule篇.files/55299.gif" /></center><br />
<br />
<center><font color="#000099"><strong>使用HttpModule实现权限系统</strong></font></center><br />
<br />
我们在开发应用系统的时候，应用系统的权限控制是非常重要的一个部分。在ASP中，要实现权限的控制是比较麻烦的事情，因为我们必须在每个需要控制权限的ASP页面中添加权限控制代码，从而控制客户对页面的访问。这样带来的问题，除了编写大量重复代码外，由于权限控制部分同业务处理部分的模块紧密耦合在一起，对权限控制模块的修改，往往又会带来大量的修改工作，甚至造成大量的Bug。 <br />
<br />
所以，我们现在需要将权限控制和业务处理模块进行解耦，使得两个部分可以独立开发和修改，而不会互相影响，或者，将影响减到最低。在Jsp程序中，这个目的可以通过引入一个前端控制器来实现权限过滤（关于前端控制器模式，可以参见《J2EE核心模式一书》）。在ASP.Net中，我们可以利用HttpModule实现同样的效果。下面来看一下实现的过程。 <br />
<br />
首先，我们会构建一个权限处理系统，可以检测某个用户对某个模块功能是否有访问权限（具体的结构，我想，读者都应该接触过这个部分的编程，所以不再赘述），其中，暴露给客户端调用的权限校验类的定义如下： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>public class RightChecker
            {
            public static bool HasRight(User user,Module module)
            {
            //进行权限校验，
            }
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
然后，我们利用HttpModule编写一个过滤器： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>using System;
            using System.Web;
            namespace MyModule
            {
            public class MyModule : IHttpModule
            {
            public void Init(HttpApplication application)
            {
            application. AcquireRequestState += (new
            EventHandler(this.Application_AcquireRequestState));
            }
            private void Application_AcquireRequestState (Object source,
            EventArgs e)
            {
            HttpApplication Application = (HttpApplication)source;
            User user=Application.Context.Sesseion["User"]  //获取User
            string url=Application.Context.Request.Path;
            //获取客户访问的页面
            Module module= //根据url得到所在的模块
            If(!RightChecker.HasRight(user,module))
            Application.Context.Server.Transfer("ErrorPage.aspx");
            //如果没有权限，引导到错误处理的页面
            }
            public void Dispose()
            {
            }
            }
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
将这个类按照前面介绍的方法，在Web.Config中注册后，我们的应用系统就具备权限管理的功能了。怎么样，比原来的方式好很多吧？ <br />
<br />
<center><font color="#000099"><strong>结束语</strong></font></center><br />
<br />
在.Net中，微软把原来具有较高难度的服务器扩展的编程作了很大的简化，对于我们开发的确带来了很大的方便，值得我们对此技术进行深入的研究。 </a></h1>
<br />
这几天在看一个项目,非常有感触.觉得自己知道的还是太少,需要学习的东西也非常之多.其实很多底层的东西应该多去了解,这样对于自己开发一个应用系统以及开发的模式会有很大的帮助,就比如系统权限方面,以前自己写的权限这块看来真的是小儿科,而今看到了利用HttpModule来配合权限的编写,又让我好好的学习了一把,在网上找到对于HttpModule的一些基础解释,先转发过来,供自己和一些路过的朋友参考.<br />
<br />
<br />
--------------------<br />
来源：赛迪网&nbsp; 作者：孙亚民<br />
<br />
ASP.Net中自定义Http处理及应用之HttpModule篇<br />
<br />
HttpHandler实现了类似于ISAPI Extention的功能，他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。而HttpModule实现了类似于ISAPI Filter的功能。 <br />
<br />
<center><font color="#000099"><strong>HttpModule的实现</strong></font></center><br />
<br />
HttpModules实现了类似于ISAPI Filter的功能，在开发上，通常需要经过以下步骤： <br />
<br />
1.编写一个类，实现IhttpModule接口 <br />
<br />
2.实现Init 方法，并且注册需要的方法 <br />
<br />
3.实现注册的方法 <br />
<br />
4.实现Dispose方法，如果需要手工为类做一些清除工作，可以添加Dispose方法的实现，但这不是必需的，通常可以不为Dispose方法添加任何代码。 <br />
<br />
5.在Web.config文件中，注册您编写的类 <br />
<br />
下面是一个HttpModules的示例，在这个示例中，只是简单的注册了HttpApplication 的BeginRequest 和 EndRequest事件，并且通过这些事件的实现方法，将相关的信息打印出来。 <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>例1：
            using System;
            using System.Web;
            namespace MyModule
            {
            public class MyModule : IHttpModule
            {
            public void Init(HttpApplication application)
            {
            application.BeginRequest += (new
            EventHandler(this.Application_BeginRequest));
            application.EndRequest += (new
            EventHandler(this.Application_EndRequest));
            }
            private void Application_BeginRequest(Object source, EventArgs e)
            {
            HttpApplication Application = (HttpApplication)source;
            HttpResponse Response=Application.Context.Response;
            Response.Write("&lt;h1&gt;Beginning of Request&lt;/h1&gt;&lt;hr&gt;");
            }
            private void Application_EndRequest(Object source, EventArgs e)
            {
            HttpApplication application = (HttpApplication)source;
            HttpResponse Response=Application.Context.Response;
            Response.Write("&lt;h1&gt;End of Request&lt;/h1&gt;&lt;hr&gt;");
            }
            public void Dispose()
            {
            }
            }
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
程序的开始引用了如下名称空间： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>using System;
            using System.Web;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
因为HttpApplication、HttpContext、HttpResponse等类在System.Web中定义，因此，System.Web名称空间是必须引用的。 <br />
<br />
MyModule类实现了IhttpModule接口。在Init方法中，指明了实现BeginRequest 和EndRequest 事件的方法。在这两个方法中，只是简单的分别打印了一些信息。 <br />
<br />
下面，在Web.config文件中注册这个类，就可以使用这个HttpModule了，注册的方法如下： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>&lt;configuration&gt;
            &lt;system.web&gt;
            &lt;httpModules&gt;
            &lt;add name=" MyModule " type=" MyModule, MyModule" /&gt;
            &lt;/httpModules&gt;
            &lt;/system.web&gt;
            &lt;/configuration&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
现在来看一下效果。编写一个Aspx页面test.aspx，内容如下： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>&lt;%
            Response.Write("&lt;h1&gt;This is the Page&lt;/h1&gt;&lt;hr&gt;");
            %&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
运行以后的界面如图所示： <br />
<br />
<center><img alt="" src="file:///F:/网站开发/MyProject/收集的学习资料/ASP_Net中自定义Http处理及应用之HttpModule篇.files/55216.gif" /></center><br />
<br />
<center><font color="#000099"><strong>深入研究HttpModule</strong></font></center><br />
<br />
HttpModule通过对HttpApplication对象的一系列事件的处理来对HTTP处理管道施加影响，这些事件在HttpModule的Init方法中进行注册，包括： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>BeginRequest
            AuthenticateRequest
            AuthorizeRequest
            ResolveRequestCache
            AcquireRequestState
            PreRequestHandlerExecute
            PostRequestHandlerExecute
            ReleaseRequestState
            UpdateRequestCache
            EndRequest</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
其中部分事件同Global.asax中的事件相对应，对应关系如下： <br />
<br />
<center><ccid_nobr>
<table class="content" border="1" width="502">
    <tbody>
        <tr>
            <td>HttpModule</td>
            <td>Global.asax</td>
        </tr>
        <tr>
            <td>BeginRequest</td>
            <td>Application_BeginRequest</td>
        </tr>
        <tr>
            <td>AuthenticateRequest</td>
            <td>Application_AuthenticateRequest</td>
        </tr>
        <tr>
            <td>EndRequest</td>
            <td>Application_EndRequest</td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center><br />
<br />
在例1中，处理了BeginRequest和EndRequest事件，其他事件的处理方式基本上类似。 <br />
<br />
同HttpHandler对应来看，这些事件，有些在HttpHandler之前发生，有些在HttpHandler处理完后发生。了解事件发生的顺序非常重要，因为，服务器端的对象在不同的时间段有着不同的表现。例子之一是Session的使用。不是所有的事件中都能对Session进行处理，而只能在有限的几个事件中进行处理。详细的过程可以参考下面的HTTP Request处理生命周期图。 <br />
<br />
<center><img alt="" src="file:///F:/网站开发/MyProject/收集的学习资料/ASP_Net中自定义Http处理及应用之HttpModule篇.files/55299.gif" /></center><br />
<br />
<center><font color="#000099"><strong>使用HttpModule实现权限系统</strong></font></center><br />
<br />
我们在开发应用系统的时候，应用系统的权限控制是非常重要的一个部分。在ASP中，要实现权限的控制是比较麻烦的事情，因为我们必须在每个需要控制权限的ASP页面中添加权限控制代码，从而控制客户对页面的访问。这样带来的问题，除了编写大量重复代码外，由于权限控制部分同业务处理部分的模块紧密耦合在一起，对权限控制模块的修改，往往又会带来大量的修改工作，甚至造成大量的Bug。 <br />
<br />
所以，我们现在需要将权限控制和业务处理模块进行解耦，使得两个部分可以独立开发和修改，而不会互相影响，或者，将影响减到最低。在Jsp程序中，这个目的可以通过引入一个前端控制器来实现权限过滤（关于前端控制器模式，可以参见《J2EE核心模式一书》）。在ASP.Net中，我们可以利用HttpModule实现同样的效果。下面来看一下实现的过程。 <br />
<br />
首先，我们会构建一个权限处理系统，可以检测某个用户对某个模块功能是否有访问权限（具体的结构，我想，读者都应该接触过这个部分的编程，所以不再赘述），其中，暴露给客户端调用的权限校验类的定义如下： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>public class RightChecker
            {
            public static bool HasRight(User user,Module module)
            {
            //进行权限校验，
            }
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
然后，我们利用HttpModule编写一个过滤器： <br />
<br />
<ccid_nobr>
<table border="1" cellspacing="0" bordercolorlight="black" bordercolordark="#ffffff" cellpadding="2" width="550" align="center">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre><ccid_code>using System;
            using System.Web;
            namespace MyModule
            {
            public class MyModule : IHttpModule
            {
            public void Init(HttpApplication application)
            {
            application. AcquireRequestState += (new
            EventHandler(this.Application_AcquireRequestState));
            }
            private void Application_AcquireRequestState (Object source,
            EventArgs e)
            {
            HttpApplication Application = (HttpApplication)source;
            User user=Application.Context.Sesseion["User"]  //获取User
            string url=Application.Context.Request.Path;
            //获取客户访问的页面
            Module module= //根据url得到所在的模块
            If(!RightChecker.HasRight(user,module))
            Application.Context.Server.Transfer("ErrorPage.aspx");
            //如果没有权限，引导到错误处理的页面
            }
            public void Dispose()
            {
            }
            }
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br />
<br />
将这个类按照前面介绍的方法，在Web.Config中注册后，我们的应用系统就具备权限管理的功能了。怎么样，比原来的方式好很多吧？ <br />
<br />
<center><font color="#000099"><strong>结束语</strong></font></center><br />
<br />
在.Net中，微软把原来具有较高难度的服务器扩展的编程作了很大的简化，对于我们开发的确带来了很大的方便，值得我们对此技术进行深入的研究。 
<img src ="http://www.blogjava.net/ebecket/aggbug/310167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-20 01:44 <a href="http://www.blogjava.net/ebecket/archive/2010/01/20/310167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IHttpModule与IHttpHandler的区别 </title><link>http://www.blogjava.net/ebecket/archive/2010/01/20/310166.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 19 Jan 2010 17:43:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/20/310166.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310166.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/20/310166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310166.html</trackback:ping><description><![CDATA[<a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/adsiz/archive/2008/01/21/1047040.html">IHttpModule与IHttpHandler的区别</a> <span style="color: red"><span style="color: red">小弟一点粗浅的想法,有不正确的地方还请各位指正.<br />
<br />
</span></span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 刚开始看这两个接口时很是迷糊了一阵子.感觉没什么不一样的地方,功能放在httpmodule和httphandler中好像都可以.后来搜了很多帖子,但都是说如何如何实现的,然后就告诉你这个代码放到哪,那个代码放到哪,看完还是不明白为什么非要这么放!(小弟头脑逻辑性比较差.只好到处去翻.)真是皇天不负有心人,得偿所望啊.<br />
<br />
IHttpModule与IHttpHandler的区别主要有两点(实际上大家看MSDN时应该也注意到了):<br />
&nbsp;&nbsp;&nbsp; 1.先后次序.先IHttpModule,后IHttpHandler.<br />
&nbsp;&nbsp;&nbsp; 2.对请求的处理上:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.<br />
<br />
下面是具体的实例.来源引用MSDN.<br />
<h1 class="dtH1"><a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconhttpmodules.asp"><span style="font-size: 12pt"><span style="font-size: 8pt"><span style="font-size: 8pt"></span></span></span></a></h1>
<h1 class="dtH1"><a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconhttpmodules.asp">如何继承并实现IHttpModule</a></h1>
<br />
<h1 class="dtH1"><a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpgenref/html/gngrfhttpmodulessection.asp">如何设置&lt;httpModules&gt; 元素</a></h1>
<br />
<h1 class="dtH1"><a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconcustomhttpmodules.asp">自定义 HttpModule 示例</a></h1>
<br />
<h1 class="dtH1"><a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpgenref/html/gngrfhttphandlerssection.asp">如何设置&lt;httpHandlers&gt; 元素</a></h1>
<br />
<h1 class="dtH1"><a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconhttphandlers.asp">如何创建 HttpHandler</a></h1>
<img src ="http://www.blogjava.net/ebecket/aggbug/310166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-20 01:43 <a href="http://www.blogjava.net/ebecket/archive/2010/01/20/310166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net Cookies安全性实践</title><link>http://www.blogjava.net/ebecket/archive/2010/01/20/310161.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 19 Jan 2010 17:30:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/20/310161.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310161.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/20/310161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310161.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310161.html</trackback:ping><description><![CDATA[<h1 class="postTitle"><a id="ctl04_TitleUrl" href="http://www.cnblogs.com/birdshover/archive/2009/04/21/1440634.html">.net Cookies安全性实践</a> </h1>
<div class="clear"></div>
<div class="postBody">
<p>首先，你要相信网络是不安全的，TCP协议也是不安全的。HTTP访问是基于TCP协议来完成的，其能够被攻击是一定的。</p>
<p>跨站脚本攻击一直是Web上常见的手段之一，攻击一般是劫持用户会话，拿到私有的钥匙。如何劫持这个会话呢？</p>
<p><strong>一、Sniffer（这里采用的软件是<strong>Sniffer，java版的那个</strong>）</strong></p>
<p>Sniffer监听会话是不可护的，就和KOF里拉尔夫的宇宙幻影一样，只要打中，一定是致命的。</p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/birdshover/Sniffer.gif" width="678" height="240" /></p>
<p>上图，就是一组侦听数据，当然这里侦听的是我本机的数据。实际上是可以侦听局域网，甚至广域网上的数据。</p>
<p>得到一组16进制的值。可以用以下代码获得其值：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img style="display: none" id="Code_Closed_Image_170215" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_170215').style.display='none'; document.getElementById('Code_Open_Image_170215').style.display='inline'; document.getElementById('Code_Open_Text_170215').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"  alt="" /><img style="display: inline" id="Code_Open_Image_170215" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_170215').style.display='none'; getElementById('Code_Closed_Image_170215').style.display='inline'; getElementById('Code_Closed_Text_170215').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"  alt="" /><span style="display: none" id="Code_Closed_Text_170215" class="cnblogs_code_Collapse">Code</span><span style="display: inline" id="Code_Open_Text_170215"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;bytestr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">""</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;byteArray&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bytestr.Split(</span><span style="color: #800000">'</span><span style="color: #800000">&nbsp;</span><span style="color: #800000">'</span><span style="color: #000000">);<br />
</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[byteArray.Length];<br />
</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;byteArray.Length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;b[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Convert.ToByte(byteArray[i],&nbsp;</span><span style="color: #800080">16</span><span style="color: #000000">);<br />
}<br />
</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;msg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Encoding.UTF8.GetString(b);<br />
Console.WriteLine(msg);<br />
<br />
Console.Read();</span></span></div>
<p>&nbsp;</p>
<p>bytestr&nbsp;变量就放置16进制字符串就行了。另外这里使用的编码是utf-8，实际应用中应该与网站的编码匹配。这个实验是拿博客园做实验的。博客园登录状态的cookie名为&#8220;.DottextCookie&#8221;。</p>
<p>在firefox中，退出博客园登录，然后切换到firebug的控制台，使用命令行键入document.cookie='.DottextCookie=******;'，然后刷新页面，看到了什么？现在正处于登录状态！</p>
<p>实际上在会话劫持中，一般都是拿登录cookie的值，无论其是否加密，都可以劫持。</p>
<p><strong>二、跨域脚本攻击</strong></p>
<p>要实现跨域脚本攻击，除了利用浏览器漏洞，或者ARP欺骗，一般需要有两个要素。首要的要素是，被攻击的网站，需要能自定义html代码(除了利用漏洞，一般是要支持script)。在客户端使用document.cookie就可以拿到cookie的值，然后进行分析，找出需要的键值对。就可以完成攻击。这里关于如何跨域保存信息就不讨论了。</p>
<p>比如有以下代码：</p>
<p>HttpCookie cookie = new HttpCookie("mmmm", "vvvvvvvvvvvv");<br />
Response.Cookies.Add(cookie);</p>
<p>实现了cookie的写入。而在这个域下的页面中，我有权限设置某个页面中包含脚本的话，就可以实现攻击。</p>
<p>&nbsp;&lt;script&gt;<br />
&nbsp;&nbsp;document.write(document.cookie);<br />
&nbsp;&lt;/script&gt;</p>
<p>以上代码是个简单的输出，如果我把拦截到的document.cookie发送到我能保存数据的地方，那么就可以拿到很多有用的信息。这样就完成了跨域脚本攻击。</p>
<p><strong>三、其它攻击方法</strong><br />
其他攻击方法只要能够拿到这个cookie就可以了，不管你是用flash或者其它办法。</p>
<p><strong>四、可以防止的和不可防止的</strong><br />
刚才介绍到Sniffer方法是不可防止，那怎么防止脚本的攻击呢？可以禁止用户使用脚本，很多网站都这么做的，如果一定要使用的话，需要对cookie做特殊设置。在dotnet中，可以这样处理：</p>
<p>HttpCookie cookie = new HttpCookie("mmmm", "vvvvvvvvvvvv");<br />
cookie.HttpOnly = true;<br />
Response.Cookies.Add(cookie);</p>
<p>这样，在客户端就不可以访问这个键值对的cookie,从而让其他人即使能用脚本拦截会话，但是无法得到关键数据。</p>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/310161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-20 01:30 <a href="http://www.blogjava.net/ebecket/archive/2010/01/20/310161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现HTTP内容的抓取</title><link>http://www.blogjava.net/ebecket/archive/2010/01/20/310162.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 19 Jan 2010 17:30:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/20/310162.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310162.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/20/310162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310162.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310162.html</trackback:ping><description><![CDATA[<h2>实现HTTP内容的抓取</h2>
<div class="entry">
<p>前段时间做了一个网页爬虫，初次接触，收获了很多知识。其中关于HTTP协议的内容，记述如下：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC2616中主要描述了HTTP 1.1协议。下面的描述没有实现其各个方面的内容，只提出了一种能够完成所有HTTP网页抓取的最小实现（不能够抓取HTTPS）。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、首先提交一个URL地址，分为普通的GET网页获取，POST的数据提交两种基本模式。<br />
<br />
建立HttpWebReques实例，其中uri是网页的URL的地址：<br />
&nbsp;&nbsp;&nbsp;HttpWebRequest webrequest =&nbsp;(HttpWebRequest) WebRequest.Create(uri);<br />
<br />
KeepAlive表示HTTP的连接是长连接：<br />
&nbsp;&nbsp;&nbsp;webrequest.KeepAlive = true;<br />
<br />
如果需要，添加引用地址，主要用于防止其他网站的连接引用，比如登陆时，经常需要验证：<br />
&nbsp;&nbsp;&nbsp;if(referer!=null)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;webrequest.Referer=referer;<br />
&nbsp;&nbsp;&nbsp;}<br />
<br />
选择数据的提交方式，有GET、POST两种方式，HEAD不常用：<br />
&nbsp;&nbsp;&nbsp;switch(RequestMethod)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;case 1:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webrequest.Method="GET";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;case 2:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webrequest.Method="POST";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;case 3:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webrequest.Method="HEAD";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;default:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webrequest.Method="GET";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;}<br />
<br />
设置User－Agent，经常遇到，在某些网站中，做了限制，User－Agent为空，则不能访问：<br />
&nbsp;&nbsp;&nbsp;webrequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50215; fqSpider)";<br />
<br />
添加其他的HTTP的Header信息，collHeader是一个NameValue的Collection：<br />
&nbsp;&nbsp;&nbsp;if(collHeader!=null&amp;&amp;collHeader.Count&gt;0)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int iCount = collHeader.Count;<br />
&nbsp;&nbsp;&nbsp;&nbsp;string key;<br />
&nbsp;&nbsp;&nbsp;&nbsp;string keyvalue;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0; i &lt; iCount; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key = collHeader.Keys[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyvalue = collHeader[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webrequest.Headers.Add(key, keyvalue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
<br />
设置Content－Type的内容，如果为POST，设置成application/x-www-form-urlencoded，如果是Get设置成text/html：<br />
&nbsp;&nbsp;&nbsp;if(webrequest.Method=="POST")<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;webrequest.ContentType="application/x-www-form-urlencoded";<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;webrequest.ContentType = "text/html"; <br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;<br />
设置代理服务器地址和端口：<br />
&nbsp;&nbsp;&nbsp;if ((ProxyServer!=null) &amp;&amp;(ProxyServer.Length &gt; 0))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;webrequest.Proxy = new <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebProxy(ProxyServer,ProxyPort);<br />
&nbsp;&nbsp;&nbsp;}<br />
<br />
设置是否允许自动转移：<br />
&nbsp;&nbsp;&nbsp;webrequest.AllowAutoRedirect = true;<br />
<br />
设置基本的登陆认证&nbsp;：<br />
&nbsp;&nbsp;&nbsp;if (NwCred)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;CredentialCache wrCache = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new CredentialCache();<br />
&nbsp;&nbsp;&nbsp;&nbsp;wrCache.Add(new Uri(uri),"Basic",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new NetworkCredential(UserName,UserPwd));<br />
&nbsp;&nbsp;&nbsp;&nbsp;webrequest.Credentials = wrCache;<br />
&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
<br />
设置Request的Cookie容器：<br />
&nbsp;&nbsp;&nbsp;webrequest.CookieContainer=Cookies;<br />
<br />
设置POST数据：<br />
&nbsp;&nbsp;&nbsp;byte[] bytes = Encoding.ASCII.GetBytes(RequestData);<br />
&nbsp;&nbsp;&nbsp;webrequest.ContentLength=bytes.Length;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;Stream oStreamOut = webrequest.GetRequestStream();<br />
&nbsp;&nbsp;&nbsp;oStreamOut.Write(bytes,0,bytes.Length);<br />
&nbsp;&nbsp;&nbsp;oStreamOut.Close();<br />
</p>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/310162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-20 01:30 <a href="http://www.blogjava.net/ebecket/archive/2010/01/20/310162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一直处于页面底部的div</title><link>http://www.blogjava.net/ebecket/archive/2010/01/20/310160.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 19 Jan 2010 17:29:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/20/310160.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310160.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/20/310160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310160.html</trackback:ping><description><![CDATA[<h1><a title="Permanent Link to 一直处于页面底部的div" href="http://paaboo.cn/wordpress/index.php/archives/168" rel="bookmark">一直处于页面底部的div</a></h1>
<div class="postinfo"><span class="date">一月 14th, 2009</span><span class="urcomments"> <a title="一直处于页面底部的div 上的评论" href="http://paaboo.cn/wordpress/index.php/archives/168#respond">No Comments &#187;</a></span><!-- by wzh --></div>
<div class="clear"></div>
<div class="entry">
<p>看到facebook每个页面底部的工具栏了吗？如图：</p>
<p><a href="http://paaboo.cn/wordpress/wp-content/uploads/2009/01/.jpg"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="阿斯顿发生大幅" src="http://paaboo.cn/wordpress/wp-content/uploads/2009/01/thumb.jpg" width="703" height="56" /></a></p>
<p>&nbsp;</p>
<p>昨天用js写了一个，代码如下：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>$(document).ready(<span class="kwrd">function</span>() {</pre>
<pre><span class="lnum">   2:  </span>            fixPosition();</pre>
<pre class="alt"><span class="lnum">   3:  </span>&nbsp;</pre>
<pre><span class="lnum">   4:  </span>            $(window).resize(fixPosition).scroll(fixPosition);</pre>
<pre class="alt"><span class="lnum">   5:  </span>        });</pre>
<pre><span class="lnum">   6:  </span>&nbsp;</pre>
<pre class="alt"><span class="lnum">   7:  </span>        <span class="kwrd">function</span> fixPosition() {</pre>
<pre><span class="lnum">   8:  </span>&nbsp;</pre>
<pre class="alt"><span class="lnum">   9:  </span>            $(<span class="str">'.bottom'</span>).css(<span class="str">"top"</span>, document.body.offsetHeight + getScrollTop() - 200)</pre>
<pre><span class="lnum">  10:  </span>            .css(<span class="str">'left'</span>, (document.body.offsetWidth - 500) / 2).html(</pre>
<pre class="alt"><span class="lnum">  11:  </span>                <span class="str">'document.body.offsetHeight:'</span> + document.body.offsetHeight</pre>
<pre><span class="lnum">  12:  </span>                + <span class="str">'&lt;br/&gt;document.body.scrollTop:'</span> + document.body.scrollTop</pre>
<pre class="alt"><span class="lnum">  13:  </span>                + <span class="str">'&lt;br/&gt;document.body.clientHeight:'</span> + document.body.clientHeight</pre>
<pre><span class="lnum">  14:  </span>                + <span class="str">'&lt;br/&gt;document.body.scrollHeight:'</span> + document.body.scrollHeight</pre>
<pre class="alt"><span class="lnum">  15:  </span>                + <span class="str">'&lt;br/&gt;document.documentElement.scrollTop:'</span> + document.documentElement.scrollTop</pre>
<pre><span class="lnum">  16:  </span>                + <span class="str">'&lt;br/&gt;'</span> + <span class="kwrd">new</span> Date().toLocaleTimeString());</pre>
<pre class="alt"><span class="lnum">  17:  </span>        }</pre>
<pre><span class="lnum">  18:  </span>        <span class="kwrd">function</span> getScrollTop() {</pre>
<pre class="alt"><span class="lnum">  19:  </span>            <span class="kwrd">var</span> scrollPos = 0;</pre>
<pre><span class="lnum">  20:  </span>            <span class="kwrd">if</span> (<span class="kwrd">typeof</span> window.pageYOffset != <span class="str">'undefined'</span>) {</pre>
<pre class="alt"><span class="lnum">  21:  </span>                scrollPos = window.pageYOffset;</pre>
<pre><span class="lnum">  22:  </span>            }</pre>
<pre class="alt"><span class="lnum">  23:  </span>            <span class="kwrd">else</span> <span class="kwrd">if</span> (<span class="kwrd">typeof</span> window.document.compatMode != <span class="str">'undefined'</span> &amp;&amp;</pre>
<pre><span class="lnum">  24:  </span>        window.document.compatMode != <span class="str">'BackCompat'</span>) {</pre>
<pre class="alt"><span class="lnum">  25:  </span>                scrollPos = window.document.documentElement.scrollTop;</pre>
<pre><span class="lnum">  26:  </span>            }</pre>
<pre class="alt"><span class="lnum">  27:  </span>            <span class="kwrd">else</span> <span class="kwrd">if</span> (<span class="kwrd">typeof</span> window.document.body != <span class="str">'undefined'</span>) {</pre>
<pre><span class="lnum">  28:  </span>                scrollPos = window.document.body.scrollTop;</pre>
<pre class="alt"><span class="lnum">  29:  </span>            }</pre>
<pre><span class="lnum">  30:  </span>            <span class="kwrd">return</span> scrollPos;</pre>
<pre class="alt"><span class="lnum">  31:  </span>        }  </pre>
</div>
<div class="csharpcode">css代码：</div>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>.bottom</pre>
<pre><span class="lnum">   2:  </span>        {</pre>
<pre class="alt"><span class="lnum">   3:  </span>            position: absolute;</pre>
<pre><span class="lnum">   4:  </span>            height: 200px;</pre>
<pre class="alt"><span class="lnum">   5:  </span>            background: #ddd;</pre>
<pre><span class="lnum">   6:  </span>            width: 500px;</pre>
<pre class="alt"><span class="lnum">   7:  </span>        }</pre>
</div>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>不过在ie和firefox下使用的时候都会闪，而facebook的却一点也不闪，好奇之下用firebug看了看样式，原来如此：</p>
<p>&nbsp;</p>
<p><a href="http://paaboo.cn/wordpress/wp-content/uploads/2009/01/1.jpg"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="热热人" src="http://paaboo.cn/wordpress/wp-content/uploads/2009/01/thumb1.jpg" width="1075" height="276" /></a> </p>
<p>原来用css实现了，代码如下</p>
<p>&nbsp;</p>
<pre>.<span style="color: #800000">bottom</span>
{
<span style="color: #ff0000">bottom</span>: <span style="color: #0000ff">0</span>;
<span style="color: #ff0000">color</span>: <span style="color: #0000ff">#111111</span>;
<span style="color: #ff0000">font-size</span>: <span style="color: #0000ff">11px</span>;
<span style="color: #ff0000">height</span>: <span style="color: #0000ff">25px</span>;
<span style="color: #ff0000">padding</span>: <span style="color: #0000ff">0</span>;
<span style="color: #ff0000">position</span>: <span style="color: #0000ff">fixed</span>;
<span style="color: #ff0000">right</span>: <span style="color: #0000ff">0</span>;
<span style="color: #ff0000">width</span>: <span style="color: #0000ff">100%</span>;
<span style="color: #ff0000">z-index</span>: <span style="color: #0000ff">99</span>;
}	</pre>
<pre>试了一下，果然不闪了，特记之。。。</pre>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/310160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-20 01:29 <a href="http://www.blogjava.net/ebecket/archive/2010/01/20/310160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>探寻IIS最大并发数 </title><link>http://www.blogjava.net/ebecket/archive/2010/01/20/310158.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 19 Jan 2010 17:27:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/20/310158.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310158.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/20/310158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310158.html</trackback:ping><description><![CDATA[<h1 class="postTitle"><a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/birdshover/archive/2009/08/16/1547025.html">探寻IIS最大并发数</a> </h1>
<div class="clear"></div>
<div class="postBody">
<p>测试系统Window 2003 Server ,IIS 6.0 ,ASP.Net 3.5 sp1<br />
Dual 1.8双核，2G内存，14G虚拟内存。</p>
<p>为了探寻IIS的最大并发数，先要做几个假设。</p>
<p>1、假设最大并发数就是当前的连接数。意思是当前能承受最大的连接，那么就表明最大的并发。<br />
2、假设IIS应用程序池处于默认状态，更改设置将会对最大连接数产生影响。</p>
<p>做完假设，现在做限制，设置站点保持HTTP连接，超时设置成0，就是不会超时。在站点请求的default.aspx页面设置线程Thread.Sleep(int.MaxValue)，接下来开发一个用来保持连接的小程序。</p>
<div class="cnblogs_code"><img style="display: none" id="Code_Closed_Image_033433" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_033433').style.display='none'; document.getElementById('Code_Open_Image_033433').style.display='inline'; document.getElementById('Code_Open_Text_033433').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"  alt="" /><img style="display: inline" id="Code_Open_Image_033433" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_033433').style.display='none'; getElementById('Code_Closed_Image_033433').style.display='inline'; getElementById('Code_Closed_Text_033433').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"  alt="" /><span style="display: none" id="Code_Closed_Text_033433" class="cnblogs_code_Collapse">Code</span><span style="display: inline" id="Code_Open_Text_033433"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Program&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">volatile</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;errorCount&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">volatile</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rightCount&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main(</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServicePointManager.DefaultConnectionLimit&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">10000</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;all&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;count</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateThread();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.Sleep(</span><span style="color: #800080">10</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(count&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">200</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #0000ff">string</span><span style="color: #000000">.Format(</span><span style="color: #800000">"</span><span style="color: #800000">sucess:{0};error:{1}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;all&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;errorCount,&nbsp;errorCount));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(all&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1800</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadKey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CreateThread()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;thread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(ActiveRequest);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.IsBackground&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.Start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ActiveRequest()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestClient&nbsp;client&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;RequestClient(</span><span style="color: #800000">"</span><span style="color: #800000">http://192.168.18.2/default.aspx?d=</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;Guid.NewGuid());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.RequestProcess();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(client.IsError)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorCount</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #0000ff">string</span><span style="color: #000000">.Format(</span><span style="color: #800000">"</span><span style="color: #800000">错误消息:{0}</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;client.Messages));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rightCount</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Console.WriteLine(client.Messages);</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span><span style="color: #008000">/*</span><span style="color: #008000">*<br />
&nbsp;*&nbsp;author&nbsp;:&nbsp;yurow<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline">http://birdshover.cnblogs.com</span><span style="color: #008000"><br />
&nbsp;*&nbsp;description:<br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;history&nbsp;:&nbsp;created&nbsp;by&nbsp;yurow&nbsp;2009-8-16&nbsp;0:29:05&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Collections.Generic;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Text;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.Net;<br />
</span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;System.IO;<br />
<br />
</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;MaxLinked&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RequestClient&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpWebRequest&nbsp;request;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebResponse&nbsp;response;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;RequestClient(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;url)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(HttpWebRequest)HttpWebRequest.Create(url);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Timeout&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">.MaxValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.KeepAlive&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorCode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddHeader(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;name,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;value)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Headers.Add(name,&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;isError&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;StringBuilder&nbsp;buffer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuilder();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ErrorCode&nbsp;{&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;IsError&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;isError;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;Messages&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;buffer.ToString();&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;RequestProcess()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.GetResponse();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(WebException&nbsp;ex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorCode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">)ex.Status;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.Append(ex.Message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isError&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(response&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream&nbsp;stream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamReader&nbsp;reader&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">stream&nbsp;=&nbsp;response.GetResponseStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">reader&nbsp;=&nbsp;new&nbsp;StreamReader(stream,&nbsp;Encoding.UTF8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">buffer.Append(reader.ReadToEnd());</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;ex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.Append(ex.Message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isError&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">if&nbsp;(reader&nbsp;!=&nbsp;null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;reader.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">if&nbsp;(stream&nbsp;!=&nbsp;null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;stream.Close();</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isError&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.Append(</span><span style="color: #800000">"</span><span style="color: #800000">建立连接失败！</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Close()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(response&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.Abort();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></span></div>
<p>&nbsp;</p>
<p>程序设置为只能启动1800个线程，这是由于.Net单进程最大线程数好像是2000个。因此，要测试最大并发数，要需要同时开几个测试进程。把系统虚拟内存调到最大值，线程过多会急剧占用内存。现在开始测试。</p>
<p>打开web站点的性能计数器，把显示比例调成1万。</p>
<p>发现到5000个连接时，IIS服务器崩溃（503错误），去洗了个澡，发现IIS服务器无法自己修复错误。又测试了几次，发现最大并发值是8200个，但是一般到5000左右就会崩溃，有时候甚至只有1000个。</p>
<p>按8200个计算，一个用户开一个浏览器浏览网页，可能会占用2～3个连接（参考《<a id="homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl00_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/birdshover/archive/2009/08/14/1546447.html"><span style="color: #6466b3">IIS连接数实验——Web开发必读</span></a> 》）,按两个计算，那么IIS默认情况下，最大并发数是4000个左右。</p>
<p>打开应用程序池配置，把最大工作进程数调高（默认为1），能有效提高最大连接数。我记得以前看过一篇文章，讲的是调到5左右比较合适。</p>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/310158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-20 01:27 <a href="http://www.blogjava.net/ebecket/archive/2010/01/20/310158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>.net Cookies安全性实践 </title><link>http://www.blogjava.net/ebecket/archive/2010/01/20/310156.html</link><dc:creator>becket_zheng</dc:creator><author>becket_zheng</author><pubDate>Tue, 19 Jan 2010 17:25:00 GMT</pubDate><guid>http://www.blogjava.net/ebecket/archive/2010/01/20/310156.html</guid><wfw:comment>http://www.blogjava.net/ebecket/comments/310156.html</wfw:comment><comments>http://www.blogjava.net/ebecket/archive/2010/01/20/310156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ebecket/comments/commentRss/310156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ebecket/services/trackbacks/310156.html</trackback:ping><description><![CDATA[<h1><a id="ctl04_TitleUrl" href="http://www.cnblogs.com/birdshover/archive/2009/04/21/1440634.html">.net Cookies安全性实践</a> </h1>
<div></div>
<div>
<p>首先，你要相信网络是不安全的，TCP协议也是不安全的。HTTP访问是基于TCP协议来完成的，其能够被攻击是一定的。</p>
<p>跨站脚本攻击一直是Web上常见的手段之一，攻击一般是劫持用户会话，拿到私有的钥匙。如何劫持这个会话呢？</p>
<p>一、Sniffer（这里采用的软件是Sniffer，java版的那个）</p>
<p>Sniffer监听会话是不可护的，就和KOF里拉尔夫的宇宙幻影一样，只要打中，一定是致命的。</p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/birdshover/Sniffer.gif" width="678" height="240" /></p>
<p>上图，就是一组侦听数据，当然这里侦听的是我本机的数据。实际上是可以侦听局域网，甚至广域网上的数据。</p>
<p>得到一组16进制的值。可以用以下代码获得其值：</p>
<p>&nbsp;</p>
<div><img id="Code_Closed_Image_170215" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_170215').style.display='none'; document.getElementById('Code_Open_Image_170215').style.display='inline'; document.getElementById('Code_Open_Text_170215').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"  alt="" /><img id="Code_Open_Image_170215" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_170215').style.display='none'; getElementById('Code_Closed_Image_170215').style.display='inline'; getElementById('Code_Closed_Text_170215').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"  alt="" />Code<br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->string&nbsp;bytestr&nbsp;=&nbsp;"";<br />
string[]&nbsp;byteArray&nbsp;=&nbsp;bytestr.Split('&nbsp;');<br />
byte[]&nbsp;b&nbsp;=&nbsp;new&nbsp;byte[byteArray.Length];<br />
for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;byteArray.Length;&nbsp;i++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;b[i]&nbsp;=&nbsp;Convert.ToByte(byteArray[i],&nbsp;16);<br />
}<br />
string&nbsp;msg&nbsp;=&nbsp;Encoding.UTF8.GetString(b);<br />
Console.WriteLine(msg);<br />
<br />
Console.Read();</div>
<p>&nbsp;</p>
<p>bytestr&nbsp;变量就放置16进制字符串就行了。另外这里使用的编码是utf-8，实际应用中应该与网站的编码匹配。这个实验是拿博客园做实验的。博客园登录状态的cookie名为&#8220;.DottextCookie&#8221;。</p>
<p>在firefox中，退出博客园登录，然后切换到firebug的控制台，使用命令行键入document.cookie='.DottextCookie=******;'，然后刷新页面，看到了什么？现在正处于登录状态！</p>
<p>实际上在会话劫持中，一般都是拿登录cookie的值，无论其是否加密，都可以劫持。</p>
<p>二、跨域脚本攻击</p>
<p>要实现跨域脚本攻击，除了利用浏览器漏洞，或者ARP欺骗，一般需要有两个要素。首要的要素是，被攻击的网站，需要能自定义html代码(除了利用漏洞，一般是要支持script)。在客户端使用document.cookie就可以拿到cookie的值，然后进行分析，找出需要的键值对。就可以完成攻击。这里关于如何跨域保存信息就不讨论了。</p>
<p>比如有以下代码：</p>
<p>HttpCookie cookie = new HttpCookie("mmmm", "vvvvvvvvvvvv");<br />
Response.Cookies.Add(cookie);</p>
<p>实现了cookie的写入。而在这个域下的页面中，我有权限设置某个页面中包含脚本的话，就可以实现攻击。</p>
<p>&nbsp;&lt;script&gt;<br />
&nbsp;&nbsp;document.write(document.cookie);<br />
&nbsp;&lt;/script&gt;</p>
<p>以上代码是个简单的输出，如果我把拦截到的document.cookie发送到我能保存数据的地方，那么就可以拿到很多有用的信息。这样就完成了跨域脚本攻击。</p>
<p>三、其它攻击方法<br />
其他攻击方法只要能够拿到这个cookie就可以了，不管你是用flash或者其它办法。</p>
<p>四、可以防止的和不可防止的<br />
刚才介绍到Sniffer方法是不可防止，那怎么防止脚本的攻击呢？可以禁止用户使用脚本，很多网站都这么做的，如果一定要使用的话，需要对cookie做特殊设置。在dotnet中，可以这样处理：</p>
<p>HttpCookie cookie = new HttpCookie("mmmm", "vvvvvvvvvvvv");<br />
cookie.HttpOnly = true;<br />
Response.Cookies.Add(cookie);</p>
<p>这样，在客户端就不可以访问这个键值对的cookie,从而让其他人即使能用脚本拦截会话，但是无法得到关键数据。</p>
</div>
<img src ="http://www.blogjava.net/ebecket/aggbug/310156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ebecket/" target="_blank">becket_zheng</a> 2010-01-20 01:25 <a href="http://www.blogjava.net/ebecket/archive/2010/01/20/310156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>