﻿<?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>博客园-Winner.Net@2007</title><link>http://www.cnblogs.com/winner/</link><description>专注与.Net技术</description><language>zh-cn</language><lastBuildDate>Sun, 06 Jul 2008 09:04:51 GMT</lastBuildDate><pubDate>Sun, 06 Jul 2008 09:04:51 GMT</pubDate><ttl>60</ttl><item><title>ExtJS入门之三 查询</title><link>http://www.cnblogs.com/winner/archive/2008/07/04/1235260.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Fri, 04 Jul 2008 01:41:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/07/04/1235260.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1235260.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/07/04/1235260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1235260.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1235260.html</trackback:ping><description><![CDATA[<h2>
<a id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/beginor/archive/2008/03/22/1117715.html">ExtJS入门之三 查询</a>
</h2>
<div class="postText">
<p>在Web开发中，对HTMLDom进行查询是必不可少的，ExtJS提供了高性能的查询功能，支持CSS3选择器（Selector）查询和基本的XPath查询。（ExtJS的查询对Xml和Html均成立）</p>
<p>看下面的HTML代码</p>
<pre><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div</span> <span style="color: #ff0000;">id</span>=<span style="color: #0000ff;">"myDiv"</span><span style="color: #0000ff;">&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">input</span> <span style="color: #ff0000;">type</span>=<span style="color: #0000ff;">"checkbox"</span> <span style="color: #ff0000;">value</span>=<span style="color: #0000ff;">"1"</span> <span style="color: #0000ff;">/&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">input</span> <span style="color: #ff0000;">type</span>=<span style="color: #0000ff;">"checkbox"</span> <span style="color: #ff0000;">value</span>=<span style="color: #0000ff;">"2"</span> <span style="color: #0000ff;">/&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">input</span> <span style="color: #ff0000;">type</span>=<span style="color: #0000ff;">"checkbox"</span> <span style="color: #ff0000;">value</span>=<span style="color: #0000ff;">"3"</span> <span style="color: #0000ff;">/&gt;</span><br />
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">input</span> <span style="color: #ff0000;">type</span>=<span style="color: #0000ff;">"checkbox"</span> <span style="color: #ff0000;">value</span>=<span style="color: #0000ff;">"4"</span> <span style="color: #0000ff;">/&gt;</span><br />
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span></pre>
<p>如果要查出myDiv之下的所有的checkbox， 可以使用如下方法：</p>
<pre>Ext.get("<span style="color: #8b0000;">myDiv</span>").select("<span style="color: #8b0000;">input[type=checkbox]</span>")</pre>
<p>对于具体的查询参数， 可以参考Ext的SDK中的Ext.DomQuery类，这里只说明Ext提供了非常强大的查询方法，可以对Html或者Xml进行元素选择查询，元素属性查询，CSS查询等高级查询。</p>
</div>
<img src ="http://www.cnblogs.com/winner/aggbug/1235260.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37548/" target="_blank">[新闻]微软高管：Wii用户最终会成为Xbox 360用户</a>]]></description></item><item><title>xtype:"combo"  动态加载</title><link>http://www.cnblogs.com/winner/archive/2008/07/03/1234888.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Thu, 03 Jul 2008 08:25:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/07/03/1234888.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1234888.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/07/03/1234888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1234888.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1234888.html</trackback:ping><description><![CDATA[<font face="Verdana">&nbsp;items : [<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {xtype:"combo",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldLabel:"显示模块",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name:"templateId",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hiddenName:"templateId",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blankText:'请选择模块',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emptyText:'选择模块',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayField:"name",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valueField:"no",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lazyRender:true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; triggerAction:"all",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typeAhead: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; store:new Ext.data.JsonStore({&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id:"id",<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url:"Control.ashx?Controller=getAppInfo",&nbsp; &nbsp;&nbsp;<br />
//&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root:"result",<br />
//&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalProperty:"rowCount",<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; remoteSort:true,&nbsp; &nbsp;<br />
//&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; baseParams:{pageSize:"-1"},&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fields:["no","name"]<br />
&nbsp;&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;&nbsp;cls : 'user',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name : 'userName',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fieldLabel : '帐号',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blankText : '帐号不能为空'<br />
&nbsp;&nbsp;&nbsp;&nbsp;}, {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cls : 'key',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name : 'password',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fieldLabel : '密码',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blankText : '密码不能为空',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputType : 'password'<br />
&nbsp;&nbsp;&nbsp;&nbsp;}]<br />
&nbsp;&nbsp;});</font>&nbsp;<br />
<br />
C#<br />
<font face="Verdana">&nbsp;&nbsp;&nbsp; public void getAppInfo(HttpContext context)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BS2.Right.AppManage.MFAppRootList appList = BS2.Right.AppManage.MFAppRootList.GetList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string result = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (appList.Count &gt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string sData = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (BS2.Right.AppManage.MFApp item in appList)<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;&nbsp;&nbsp;&nbsp; sData = sData + "," + "{\'no\':" + item.AppNo + ",\'name\':\'" + item.AppName + "\'}";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = "[" + sData.Substring(1) + "]";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; //"[{'no':0,'name':'应用管理系统'},{'no':1,'name':'产品资源管理'},{'no':2,'name':'商品库存管理'},{'no':45,'name':'56'}]"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.ContentType = "application/x-json";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.Write(result);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.Response.End();<br />
&nbsp;&nbsp;&nbsp; }</font><br />
<br />
<img src ="http://www.cnblogs.com/winner/aggbug/1234888.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37547/" target="_blank">[新闻]遵守YouTube案裁定 谷歌将陷入隐私指控深渊</a>]]></description></item><item><title>JS//键盘KEYDOWN事件</title><link>http://www.cnblogs.com/winner/archive/2008/06/25/1229430.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Wed, 25 Jun 2008 02:42:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/06/25/1229430.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1229430.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/06/25/1229430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1229430.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1229430.html</trackback:ping><description><![CDATA[<p><font face="Verdana">&lt;script language="JavaScript"&gt; <br />
&lt;!--<br />
//键盘KEYDOWN事件&nbsp; 3000+.pos&nbsp; By Winner update 2007-9-25<br />
function BSkeyDown(e){<br />
&nbsp; if (document.all){ </font></p>
<p><font face="Verdana">&nbsp;var ieKey = event.keyCode;<br />
&nbsp; // alert(ieKey);<br />
&nbsp;&nbsp;if (event.ctrlKey &amp;&amp; event.altKey &amp;&amp; event.shiftKey&nbsp; &amp;&amp; ieKey==90) { <br />
&nbsp; alert("显示")<br />
&nbsp;//-------------------------------<br />
&nbsp;// Ctrl + Alt + Shift ＋ otherKey<br />
&nbsp;// 此处设置Ctrl,Alt,Shift三个键一起按下后的快捷处理。<br />
&nbsp;//-------------------------------<br />
&nbsp;&nbsp;switch (ieKey) {<br />
&nbsp;&nbsp;}<br />
&nbsp;//-------------------------------<br />
&nbsp;} else if (event.ctrlKey &amp;&amp; event.altKey) {<br />
&nbsp;//-------------------------------<br />
&nbsp;// Ctrl + Alt ＋ otherKey<br />
&nbsp;// 此处设置Ctrl,Alt两个键一起按下后的快捷处理。<br />
&nbsp;//-------------------------------<br />
&nbsp;&nbsp;switch (ieKey) {<br />
&nbsp;&nbsp;}<br />
&nbsp;//-------------------------------<br />
&nbsp;} else if (event.ctrlKey) {&nbsp; <br />
&nbsp;//-------------------------------<br />
&nbsp;// Ctrl + otherKey<br />
&nbsp;// 此处设置Ctrl键加其它键的快捷处理。<br />
&nbsp;//-------------------------------<br />
&nbsp;&nbsp; <br />
&nbsp;//-------------------------------<br />
&nbsp;} else if (event.altKey) {&nbsp; <br />
&nbsp;//-------------------------------<br />
&nbsp;// Alt + otherKey<br />
&nbsp;// 此处设置Alt键加其它键的快捷处理。<br />
&nbsp;//-------------------------------<br />
&nbsp;&nbsp; <br />
&nbsp;//-------------------------------<br />
&nbsp;} else if (event.shiftKey)&nbsp;{&nbsp; <br />
&nbsp;//-------------------------------<br />
&nbsp;// Shift + otherKey<br />
&nbsp;// 此处设置Shift键加其它键的快捷处理。<br />
&nbsp;//-------------------------------<br />
&nbsp;&nbsp; <br />
&nbsp;//-------------------------------<br />
&nbsp;} else {<br />
&nbsp;//-------------------------------<br />
&nbsp;// 此处设置按单个键的快捷处理。<br />
&nbsp;//-------------------------------<br />
&nbsp;&nbsp; <br />
&nbsp;//-------------------------------<br />
&nbsp;} <br />
&nbsp; }&nbsp; <br />
}&nbsp;&nbsp; <br />
//--&gt;<br />
&lt;/script&gt; </font></p>
<p><font face="Verdana">&lt;script language="JavaScript"&gt;<br />
&lt;!--<br />
document.onkeydown = BSkeyDown; <br />
//--&gt;<br />
&lt;/script&gt;</font></p>
<img src ="http://www.cnblogs.com/winner/aggbug/1229430.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37546/" target="_blank">[新闻]iPhone入华在即 中国手机产业生存面临考验</a>]]></description></item><item><title>转 Using log4net，</title><link>http://www.cnblogs.com/winner/archive/2008/06/23/1228224.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Mon, 23 Jun 2008 07:22:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/06/23/1228224.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1228224.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/06/23/1228224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1228224.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1228224.html</trackback:ping><description><![CDATA[摘要: 声明：本文内容主要译自Nauman Leghari的Using log4net，亦加入了个人的一点心得(节3.1.4)。请在这里下载示例代码 转自 http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html1 简介 1.1 Log4net的优点： 几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后，就不太可能再利&nbsp;&nbsp;<a href='http://www.cnblogs.com/winner/archive/2008/06/23/1228224.html'>阅读全文</a><img src ="http://www.cnblogs.com/winner/aggbug/1228224.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37545/" target="_blank">[新闻]阿里巴巴集团再向淘宝注资20亿元</a>]]></description></item><item><title>日志记录组件[Log4net]详细介绍(转) </title><link>http://www.cnblogs.com/winner/archive/2008/06/20/1227010.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Fri, 20 Jun 2008 09:34:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/06/20/1227010.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1227010.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/06/20/1227010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1227010.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1227010.html</trackback:ping><description><![CDATA[<h2><a id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/liwei6797/archive/2007/04/27/729679.html">日志记录组件[Log4net]详细介绍(转)</a> </h2>
<div class="tit" twffan="done">&nbsp;</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" twffan="done">
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">因为工作中有要用到Log记录，找到一篇不错的文章，就转了过来。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">一&nbsp;Log4net简介</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Log4net是基于.net开发的一款非常著名的记录日志开源组件。他最早是2001年7月由NeoWorks&nbsp;Limited启动的项目，基本的框架源于另外的一个非常著名的姐妹组件－log4j。Log4net记录日志的功能非常强大。它可以将日志分不同的等级，比不同的样式，将日志输出到不同的媒介。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Log4net可以从</font><a href="http://logging.apache.org/log4net/downloads.html"><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#0000ff" size="2">http://logging.apache.org/log4net/downloads.html</font></a><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">网站下载最新版本。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">二&nbsp;Log4net核心组成</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Log4net主要由五个部分组成，分别为Logger，Appenders,&nbsp;Filters,&nbsp;Layouts&nbsp;和Object&nbsp;Renders。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">一）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger(日志)</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">1．&nbsp;记录日志的分类：</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Log4net能够以多种方式输出日志。支持的日志输出常用的主要媒介有数据库（包括MS&nbsp;SQL&nbsp;Server,&nbsp;Access,&nbsp;Oracle9i,Oracle8i,DB2,SQLite，控制台，文件，事件日志(可以用事件查看器查看)和邮件等多种方式。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">2．&nbsp;日志的级别</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Log4net支持多种级别的日志。优先级从高到低依次排列如下:</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">FATAL&nbsp;&gt;&nbsp;ERROR&nbsp;&gt;&nbsp;WARN&nbsp;&gt;&nbsp;INFO&nbsp;&gt;&nbsp;DEBUG</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">此外还有ALL（允许所有的日志请求）和OFF（拒绝所有的日志请求）这两种特殊的级别。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">二）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Appenders</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Appenders决定日志输出的方式。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Appenders必须实现log4net.Appenders.IAppender接口。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Log4net目前支持的输出方式包括：<br />
            1&nbsp;AdoNetAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志记录到数据库中。可以采用SQL和存储过程两种方式。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">2&nbsp;AnsiColorTerminalAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;在ANSI&nbsp;窗口终端写下高亮度的日志事件。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">3&nbsp;AspNetTraceAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;能用asp.net中Trace的方式查看记录的日志。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">4&nbsp;BufferingForwardingAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;在输出到子Appenders之前先缓存日志事件。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">5&nbsp;ConsoleAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志输出到控制台。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">6&nbsp;EventLogAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志写到Windows&nbsp;Event&nbsp;Log.&nbsp;</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">7&nbsp;FileAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志写到文件中。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">8&nbsp;LocalSyslogAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志写到local&nbsp;syslog&nbsp;service&nbsp;(仅用于UNIX环境下).&nbsp;<br />
            9&nbsp;MemoryAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志存到内存缓冲区。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">10&nbsp;NetSendAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志输出到Windows&nbsp;Messenger&nbsp;service.这些日志信息将在用户终端的对话框中显示。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">11&nbsp;RemoteSyslogAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;通过UDP网络协议将日志写到Remote&nbsp;syslog&nbsp;service。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">12&nbsp;RemotingAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;通过.NET&nbsp;Remoting将日志写到远程接收端。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">13&nbsp;RollingFileAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志以回滚文件的形式写到文件中。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">14&nbsp;SmtpAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志写到邮件中。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">15&nbsp;TraceAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志写到.NET&nbsp;trace&nbsp;系统。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">16&nbsp;UdpAppender<br />
            &nbsp;&nbsp;&nbsp;&nbsp;将日志connectionless&nbsp;UDP&nbsp;datagrams的形式送到远程宿主或以UdpClient的形式广播。&nbsp;</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">三）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Filters</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Appender对象将日志以缺省的方式传到输出流，然后Filter可以按照不同的标准控制日志的输出。Filter可以再配置文件中配置。最简单的形式是在appender中写明一个Threshold.这样只有级别大于或等于此Threshold的日志才被记录。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Filters必须实现log4net.Filters.IFilter接口。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">四）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Layouts</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Layouts控制日志显示的格式样式。日志的显示格式如下：</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">"%timestamp&nbsp;[%thread]&nbsp;%-5level&nbsp;%logger&nbsp;-&nbsp;%message%newline"</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Timestamp:&nbsp;表示程序已经开始执行的时间。&nbsp;单位[毫秒]。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Thread:执行当前代码的线程。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Level：日志的级别。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Logger：日志相关请求的名称。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Message:　日志消息。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Layouts还可以控制日志的输出样式，比如以普通形式或以xml等形式输出。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">五）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;Renderers</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">这是很重要的一项，log4net将按照用户定义的标准输出日志消息。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">Object&nbsp;Renders必须实现log4net.ObjectRenderer.IObjectRenerer接口。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">三&nbsp;如何在项目中使用log4net</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">下面有个基于控制台的demo，举例描述了log4net怎么用于输出日志。<br />
            本例中，日志将会记录到文件，控制台，事件日至和Access数据库中。</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">一）主要代码:</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">1.&nbsp;配置文件app.config</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2"></font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">&nbsp;1&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"&nbsp;?&gt;<br />
            &nbsp;2&lt;configuration&gt;<br />
            &nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;Register&nbsp;a&nbsp;section&nbsp;handler&nbsp;for&nbsp;the&nbsp;log4net&nbsp;section&nbsp;--&gt;<br />
            &nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&lt;configSections&gt;<br />
            &nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;section&nbsp;name="log4net"&nbsp;type="System.Configuration.IgnoreSectionHandler"&nbsp;/&gt;<br />
            &nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&lt;/configSections&gt;<br />
            &nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&lt;appSettings&gt;<br />
            &nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;To&nbsp;enable&nbsp;internal&nbsp;log4net&nbsp;logging&nbsp;specify&nbsp;the&nbsp;following&nbsp;appSettings&nbsp;key&nbsp;--&gt;<br />
            &nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;&lt;add&nbsp;key="log4net.Internal.Debug"&nbsp;value="true"/&gt;&nbsp;--&gt;&lt;/appSettings&gt;<br />
            10&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;This&nbsp;section&nbsp;contains&nbsp;the&nbsp;log4net&nbsp;configuration&nbsp;settings&nbsp;--&gt;<br />
            11&nbsp;&nbsp;&nbsp;&nbsp;&lt;log4net&gt;<br />
            12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--定义输出到文件中--&gt;<br />
            13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender&nbsp;name="LogFileAppender"&nbsp;type="log4net.Appender.FileAppender"&gt;<br />
            14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--定义文件存放位置--&gt;<br />
            15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;file&nbsp;value="D:\log-file1.txt"&nbsp;/&gt;<br />
            16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;Example&nbsp;using&nbsp;environment&nbsp;variables&nbsp;in&nbsp;params&nbsp;--&gt;<br />
            17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;&lt;file&nbsp;value="${TMP}\log-file.txt"&nbsp;/&gt;&nbsp;--&gt;<br />
            18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&lt;sppendToFile&nbsp;value="true"&nbsp;/&gt;--&gt;<br />
            19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;An&nbsp;alternate&nbsp;output&nbsp;encoding&nbsp;can&nbsp;be&nbsp;specified&nbsp;--&gt;<br />
            20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;&lt;encoding&nbsp;value="unicodeFFFE"&nbsp;/&gt;&nbsp;--&gt;<br />
            21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout&nbsp;type="log4net.Layout.PatternLayout"&gt;<br />
            22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--每条日志末尾的文字说明--&gt;<br />
            23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;footer&nbsp;value="[Footer]--Test&nbsp;By&nbsp;Ring1981&nbsp;&nbsp;"&nbsp;/&gt;<br />
            24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--输出格式--&gt;<br />
            25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conversionPattern&nbsp;value="%date&nbsp;[%thread]&nbsp;%-5level&nbsp;%logger&nbsp;[%ndc]&nbsp;&amp;lt;%property{auth}&amp;gt;&nbsp;-&nbsp;%message%newline"&nbsp;/&gt;<br />
            26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/appender&gt;<br />
            28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--定义输出到控制台命令行中--&gt;<br />
            29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender&nbsp;name="ConsoleAppender"&nbsp;type="log4net.Appender.ConsoleAppender"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout&nbsp;type="log4net.Layout.PatternLayout"&gt;<br />
            31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conversionPattern&nbsp;value="%date&nbsp;[%thread]&nbsp;%-5level&nbsp;%logger&nbsp;[%property{NDC}]&nbsp;-&nbsp;%message%newline"&nbsp;/&gt;<br />
            32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;<br />
            33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/appender&gt;<br />
            34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--定义输出到windows事件中--&gt;<br />
            35&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender&nbsp;name="EventLogAppender"&nbsp;type="log4net.Appender.EventLogAppender"&gt;<br />
            36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout&nbsp;type="log4net.Layout.PatternLayout"&gt;<br />
            37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conversionPattern&nbsp;value="%date&nbsp;[%thread]&nbsp;%-5level&nbsp;%logger&nbsp;[%property{NDC}]&nbsp;-&nbsp;%message%newline"&nbsp;/&gt;<br />
            38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;<br />
            39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/appender&gt;<br />
            40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--定义输出到数据库中，这里举例输出到Access数据库中，数据库为D盘的access.mdb--&gt;<br />
            41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender&nbsp;name="AdoNetAppender_Access"&nbsp;type="log4net.Appender.AdoNetAppender"&gt;<br />
            42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;connectionString&nbsp;value="Provider=Microsoft.Jet.OLEDB.4.0;Data&nbsp;Source=D:\access.mdb"&nbsp;/&gt;<br />
            43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;commandText&nbsp;value="INSERT&nbsp;INTO&nbsp;Log&nbsp;([Date],[Thread],[Level],[Logger],[Message])&nbsp;VALUES&nbsp;(@log_date,&nbsp;@thread,&nbsp;@log_level,&nbsp;@logger,&nbsp;@message)"&nbsp;/&gt;<br />
            44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--定义各个参数--&gt;<br />
            45&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameter&gt;<br />
            46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameterName&nbsp;value="@log_date"&nbsp;/&gt;<br />
            47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dbType&nbsp;value="String"&nbsp;/&gt;<br />
            48&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;size&nbsp;value="255"&nbsp;/&gt;<br />
            49&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout&nbsp;type="log4net.Layout.PatternLayout"&gt;<br />
            50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conversionPattern&nbsp;value="%date"&nbsp;/&gt;<br />
            51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;<br />
            52&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/parameter&gt;<br />
            53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameter&gt;<br />
            54&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameterName&nbsp;value="@thread"&nbsp;/&gt;<br />
            55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dbType&nbsp;value="String"&nbsp;/&gt;<br />
            56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;size&nbsp;value="255"&nbsp;/&gt;<br />
            57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout&nbsp;type="log4net.Layout.PatternLayout"&gt;<br />
            58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conversionPattern&nbsp;value="%thread"&nbsp;/&gt;<br />
            59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;<br />
            60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/parameter&gt;<br />
            61&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameter&gt;<br />
            62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameterName&nbsp;value="@log_level"&nbsp;/&gt;<br />
            63&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dbType&nbsp;value="String"&nbsp;/&gt;<br />
            64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;size&nbsp;value="50"&nbsp;/&gt;<br />
            65&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout&nbsp;type="log4net.Layout.PatternLayout"&gt;<br />
            66&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conversionPattern&nbsp;value="%level"&nbsp;/&gt;<br />
            67&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;<br />
            68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/parameter&gt;<br />
            69&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameter&gt;<br />
            70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameterName&nbsp;value="@logger"&nbsp;/&gt;<br />
            71&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dbType&nbsp;value="String"&nbsp;/&gt;<br />
            72&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;size&nbsp;value="255"&nbsp;/&gt;<br />
            73&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout&nbsp;type="log4net.Layout.PatternLayout"&gt;<br />
            74&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conversionPattern&nbsp;value="%logger"&nbsp;/&gt;<br />
            75&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;<br />
            76&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/parameter&gt;<br />
            77&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameter&gt;<br />
            78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameterName&nbsp;value="@message"&nbsp;/&gt;<br />
            79&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;dbType&nbsp;value="String"&nbsp;/&gt;<br />
            80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;size&nbsp;value="1024"&nbsp;/&gt;<br />
            81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;layout&nbsp;type="log4net.Layout.PatternLayout"&gt;<br />
            82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conversionPattern&nbsp;value="%message"&nbsp;/&gt;<br />
            83&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/layout&gt;<br />
            84&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/parameter&gt;<br />
            85&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/appender&gt;<br />
            86&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--定义日志的输出媒介，下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。--&gt;<br />
            87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;root&gt;<br />
            88&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender-ref&nbsp;ref="LogFileAppender"&nbsp;/&gt;<br />
            89&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender-ref&nbsp;ref="ConsoleAppender"&nbsp;/&gt;<br />
            90&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender-ref&nbsp;ref="EventLogAppender"&nbsp;/&gt;<br />
            91&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;appender-ref&nbsp;ref="AdoNetAppender_Access"&nbsp;/&gt;<br />
            92&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/root&gt;<br />
            93&nbsp;&nbsp;&nbsp;&nbsp;&lt;/log4net&gt;<br />
            94&lt;/configuration&gt;<br />
            2.&nbsp;LoggingExample.cs</font></p>
            <p><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">&nbsp;1//&nbsp;Configure&nbsp;log4net&nbsp;using&nbsp;the&nbsp;.config&nbsp;file<br />
            &nbsp;2[assembly:&nbsp;log4net.Config.XmlConfigurator(Watch=true)]<br />
            &nbsp;3//&nbsp;This&nbsp;will&nbsp;cause&nbsp;log4net&nbsp;to&nbsp;look&nbsp;for&nbsp;a&nbsp;configuration&nbsp;file<br />
            &nbsp;4//&nbsp;called&nbsp;ConsoleApp.exe.config&nbsp;in&nbsp;the&nbsp;application&nbsp;base<br />
            &nbsp;5//&nbsp;directory&nbsp;(i.e.&nbsp;the&nbsp;directory&nbsp;containing&nbsp;ConsoleApp.exe)<br />
            &nbsp;6<br />
            &nbsp;7namespace&nbsp;ConsoleApp<br />
            &nbsp;8{<br />
            &nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;System;<br />
            10<br />
            11&nbsp;&nbsp;&nbsp;&nbsp;/**////&nbsp;&lt;summary&gt;<br />
            12&nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;Example&nbsp;of&nbsp;how&nbsp;to&nbsp;simply&nbsp;configure&nbsp;and&nbsp;use&nbsp;log4net<br />
            13&nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br />
            14&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;LoggingExample<br />
            15&nbsp;&nbsp;&nbsp;&nbsp;{<br />
            16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;readonly&nbsp;log4net.ILog&nbsp;log&nbsp;=&nbsp;log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);<br />
            17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;Main(string[]&nbsp;args)<br />
            19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
            20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.Error("Error&nbsp;Acc");<br />
            21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.Fatal("Fatle&nbsp;Acc");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.ReadLine();<br />
            23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            25<br />
            26&nbsp;&nbsp;&nbsp;&nbsp;}<br />
            27}<br />
            28<br />
            运行程序，日志就会以xml中定义的四种媒介形式输出。&nbsp;<br />
            源代码可以从</font><a href="http://www.cnblogs.com/Files/Ring1981/Log4net%20Test.rar"><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#0033ff" size="2">http://www.cnblogs.com/Files/Ring1981/Log4net%20Test.rar</font></a><font style="background-color: #ffffff" face="arial,helvetica,sans-serif" color="#000000" size="2">下载。</font></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnblogs.com/winner/aggbug/1227010.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37544/" target="_blank">[新闻]56被关一月 危机的是整个视频业</a>]]></description></item><item><title>C#日志工具汇总</title><link>http://www.cnblogs.com/winner/archive/2008/06/20/1227004.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Fri, 20 Jun 2008 09:22:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/06/20/1227004.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1227004.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/06/20/1227004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1227004.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1227004.html</trackback:ping><description><![CDATA[<div class="tit">C#日志工具汇总</div>
<div class="date">2007-09-06 22:31</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">
            <p><strong>log4net&nbsp;&nbsp;&nbsp;&nbsp;<br />
            </strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4net是一个可以帮助程序员把日志信息输出到各种不同目标的.net类库。它可以容易的加载到开发项目中,实现程序调试和运行的时候的日志信息输出,提供了比.net自己提供的debug类和trace类的功能更多。log4net是从java下有卓越表现的log4j移植过来的。它是<font color="#0000ff">apache</font>基金资助的项目的一部分。</p>
            <p><strong>NLog&nbsp;&nbsp;</strong>&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; NLog是C#编写的开源日志类库&nbsp;&nbsp;&nbsp; ，它的设计思想是使其简单而灵活。NLog让你处理诊断的日志消息，用相关信息扩充消息，依照你的选择格式化日志消息和把日志消息输出到一个或多个目的地。</p>
            <p><strong>LogThis&nbsp;&nbsp;</strong> <br />
            &nbsp;&nbsp;&nbsp;&nbsp; LogThis是为.NET应用程序提供的一款C#开源日志框架，它可以嵌入到应用程序之中。</p>
            <p><strong>AppLog</strong>&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; AppLog是一个简单的应用日志工具。它使用C#开发，且使用ByteFX MySQL 数据访问库.。</p>
            <p><strong>C# .NET LOGGER&nbsp;&nbsp;&nbsp;<br />
            </strong>&nbsp;&nbsp;&nbsp;&nbsp; C#开发的可扩展日志工具，有高级消息队列支持，可以异步使用。</p>
            <p><strong>CSharp Logger</strong>&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; CSharp Logger是<font color="#0000ff">apache</font>继log4net项目后设计的又一个日志工具。它用来向Windows的事件日志写入debug、info、warn和error四个等级的信息。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnblogs.com/winner/aggbug/1227004.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37544/" target="_blank">[新闻]56被关一月 危机的是整个视频业</a>]]></description></item><item><title>MSBuild 强在功能 (C#调用 命令行工具)</title><link>http://www.cnblogs.com/winner/archive/2008/05/26/1207903.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Mon, 26 May 2008 12:09:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/05/26/1207903.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1207903.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/05/26/1207903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1207903.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1207903.html</trackback:ping><description><![CDATA[<p><font face="Verdana">using System;</font></p>
<p><font face="Verdana">using System.Diagnostics;</font></p>
<p><font face="Verdana">namespace ZZ<br />
{</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; class ZZConsole<br />
&nbsp;&nbsp;&nbsp; {</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [STAThread]</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string cspPath = "D:\\ywmtest123\\ywmtest123.csproj";</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strRst = CmdMSBuild(cspPath);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(strRst);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadLine();</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static string CmdMSBuild(string cspPath)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process p = new Process();</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.FileName = "cmd.exe";</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.UseShellExecute = false;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.RedirectStandardInput = true;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.RedirectStandardOutput = true;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.RedirectStandardError = true;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StartInfo.CreateNoWindow = true;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string pingrst;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.Start();</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StandardInput.WriteLine("C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727\\MSBuild " + cspPath);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.StandardInput.WriteLine("exit");</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string strRst = p.StandardOutput.ReadToEnd();</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strRst.IndexOf("(0% loss)") != -1)</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pingrst = "连接";</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (strRst.IndexOf("Destination host unreachable.") != -1)</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pingrst = "无法到达目的主机";</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (strRst.IndexOf("Request timed out.") != -1)</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pingrst = "超时";</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (strRst.IndexOf("Unknown host") != -1)</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pingrst = "无法解析主机";</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pingrst = strRst;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.Close();</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pingrst;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">}</font></p>
<p><font face="Verdana"></font>&nbsp;</p>
<img src ="http://www.cnblogs.com/winner/aggbug/1207903.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37543/" target="_blank">[新闻]李开复：中文搜索是谷歌战略核心</a>]]></description></item><item><title>5.21动态生成dll</title><link>http://www.cnblogs.com/winner/archive/2008/05/21/1203802.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Wed, 21 May 2008 02:17:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/05/21/1203802.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1203802.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/05/21/1203802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1203802.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1203802.html</trackback:ping><description><![CDATA[摘要: using System;using System.CodeDom.Compiler;using Microsoft.CSharp;using System.Reflection;using System.Text;using System.CodeDom;using System.IO;namespace ConsoleApplication1{ /// &lt;summary&gt; /// &nbsp;&nbsp;<a href='http://www.cnblogs.com/winner/archive/2008/05/21/1203802.html'>阅读全文</a><img src ="http://www.cnblogs.com/winner/aggbug/1203802.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37542/" target="_blank">[新闻]《星际争霸2》新图：黑暗圣堂武士Zeratul</a>]]></description></item><item><title>(转)在C#中动态编译类</title><link>http://www.cnblogs.com/winner/archive/2008/05/20/1203025.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Tue, 20 May 2008 01:27:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/05/20/1203025.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1203025.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/05/20/1203025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1203025.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1203025.html</trackback:ping><description><![CDATA[<div class="ArticleBlogText">
<div align="right"><img style="cursor: hand" onclick="javascript:changeStyle(0);" alt="字体变小" src="file:///C:/Documents%20and%20Settings/Winner/桌面/c#动态生成/在C#中动态编译类%20-%20痕迹%20-%20fireicesion%20-%20和讯博客_files/xiao.gif" /> <img style="cursor: hand" onclick="javascript:changeStyle(1);" alt="字体变大" src="file:///C:/Documents%20and%20Settings/Winner/桌面/c#动态生成/在C#中动态编译类%20-%20痕迹%20-%20fireicesion%20-%20和讯博客_files/da.gif" /></div>
<div id="BlogArticleDetail" style="font-size: 14px">
<p style="color: #000000">using System;<br />
using System.CodeDom.Compiler;<br />
using Microsoft.CSharp;<br />
using System.Reflection;<br />
using System.Text;</p>
<p style="color: #000000">namespace ConsoleApplication1<br />
{<br />
&nbsp;/// &lt;summary&gt;<br />
&nbsp;/// Class1 的摘要说明。<br />
&nbsp;/// &lt;/summary&gt;<br />
&nbsp;class Class1<br />
&nbsp;{<br />
&nbsp;&nbsp;/// &lt;summary&gt;<br />
&nbsp;&nbsp;/// 应用程序的主入口点。<br />
&nbsp;&nbsp;/// &lt;/summary&gt;<br />
&nbsp;&nbsp;[STAThread]<br />
&nbsp;&nbsp;static void Main(string[] args)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;//<br />
&nbsp;&nbsp;&nbsp;// TODO: 在此处添加代码以启动应用程序<br />
&nbsp;&nbsp;&nbsp;//<br />
&nbsp;&nbsp;&nbsp;int i = (int)Calc("1+2*3");<br />
&nbsp;&nbsp;&nbsp;Console.WriteLine(i.ToString());<br />
&nbsp;&nbsp;&nbsp;Console.ReadLine();</p>
<p style="color: #000000">&nbsp;&nbsp;}</p>
<p style="color: #000000">&nbsp;&nbsp;public&nbsp; static&nbsp; object&nbsp; Calc(string&nbsp; expression)&nbsp; <br />
&nbsp;&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;string&nbsp; className&nbsp; =&nbsp; "Calc";&nbsp; <br />
&nbsp;&nbsp;&nbsp;string&nbsp; methodName&nbsp; =&nbsp; "Run";&nbsp; <br />
&nbsp;&nbsp;&nbsp;expression=expression.Replace("/","*1.0/");<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;//&nbsp; 创建编译器实例。&nbsp; <br />
&nbsp;&nbsp;&nbsp;ICodeCompiler&nbsp; complier&nbsp; =&nbsp; (new&nbsp; CSharpCodeProvider().CreateCompiler());&nbsp; </p>
<p style="color: #000000">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//&nbsp; 设置编译参数。&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CompilerParameters&nbsp; paras&nbsp; =&nbsp; new&nbsp; CompilerParameters();&nbsp; <br />
&nbsp;&nbsp;&nbsp;paras.GenerateExecutable&nbsp; =&nbsp; false;&nbsp;&nbsp; //编译成exe还是dll<br />
&nbsp;&nbsp;&nbsp;paras.GenerateInMemory&nbsp; =&nbsp; false;&nbsp;&nbsp; //是否写入内存,不写入内存就写入磁盘<br />
&nbsp;&nbsp;&nbsp;paras.OutputAssembly = "c:\\inetpub\\wwwroot\\test.dll";&nbsp; //输出路径<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;//&nbsp; 创建动态代码。&nbsp; <br />
&nbsp;&nbsp;&nbsp;StringBuilder&nbsp; classSource&nbsp; =&nbsp; new&nbsp; StringBuilder();&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;classSource.Append("public&nbsp; class&nbsp; "+&nbsp; className&nbsp; +"\n");&nbsp; <br />
&nbsp;&nbsp;&nbsp;classSource.Append("{\n");&nbsp; <br />
&nbsp;&nbsp;&nbsp;classSource.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp; object&nbsp; "&nbsp; +&nbsp; methodName&nbsp; +&nbsp; "()\n");&nbsp; <br />
&nbsp;&nbsp;&nbsp;classSource.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {\n");&nbsp; <br />
&nbsp;&nbsp;&nbsp;classSource.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; "+&nbsp; expression&nbsp; +&nbsp; ";\n");&nbsp; <br />
&nbsp;&nbsp;&nbsp;classSource.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }\n");&nbsp; <br />
&nbsp;&nbsp;&nbsp;classSource.Append("}");&nbsp; <br />
&nbsp;<br />
//&nbsp;&nbsp;&nbsp;System.Diagnostics.Debug.WriteLine(classSource.ToString());&nbsp; <br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;//&nbsp; 编译代码。&nbsp; <br />
&nbsp;&nbsp;&nbsp;CompilerResults&nbsp; result&nbsp; =&nbsp; complier.CompileAssemblyFromSource(paras,&nbsp; classSource.ToString());&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;//&nbsp; 获取编译后的程序集。&nbsp; <br />
&nbsp;&nbsp;&nbsp;Assembly&nbsp; assembly&nbsp; =&nbsp; result.CompiledAssembly;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;//&nbsp; 动态调用方法。&nbsp; <br />
&nbsp;&nbsp;&nbsp;object&nbsp; eval&nbsp; =&nbsp; assembly.CreateInstance(className);&nbsp; <br />
&nbsp;&nbsp;&nbsp;MethodInfo&nbsp; method&nbsp; =&nbsp; eval.GetType().GetMethod(methodName);&nbsp; <br />
&nbsp;&nbsp;&nbsp;object reobj = method.Invoke(eval,&nbsp; null);<br />
&nbsp;&nbsp;&nbsp;GC.Collect();<br />
&nbsp;&nbsp;&nbsp;return reobj;</p>
<p style="color: #000000">&nbsp;&nbsp;}</p>
<p style="color: #000000">&nbsp;}<br />
}<br />
</p>
</div>
</div>
<img src ="http://www.cnblogs.com/winner/aggbug/1203025.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37541/" target="_blank">[新闻]FriendFeed介绍</a>]]></description></item><item><title>使用ASP.Net Forms模式实现WebService身份验证 </title><link>http://www.cnblogs.com/winner/archive/2008/05/05/1184115.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Mon, 05 May 2008 14:16:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/05/05/1184115.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1184115.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/05/05/1184115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1184115.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1184115.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 在安全性要求不是很高的ASP.Net程序中，基于Forms的身份验证是经常使用的一种方式，而如果需要对WebService进行身份验证，最常用的可能是基于Soap 标头的自定义身份验证方式。如果对两者做一下比较的话，显然，基于Forms的验证方式更加方便易用，能否将Forms验证方式应用到WebService中去呢？&nbsp;<br />
&nbsp;&nbsp;&nbsp; 从理论上讲，使用基于Forms的方式对WebService进行身份验证是可行的，但是使用过程中会存在以下两个问题：<br />
1.基于Forms的验证方式同时也是基于Cookie的验证方式，在使用浏览器时，这个问题是不需要我们考虑的。但对于使用WebService的应用程序来说，默认是不能保存Cookie的，需要我们自己去做这个工作。<br />
2.WebService<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">既然是一个</span><span lang="EN-US">A<ST1:CHMETCNV w:st="on" unitname="a" sourcevalue="2" hasspace="False" negative="False" numbertype="1" tcsc="0">2A</ST1:CHMETCNV>(Application To Application)</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用程序，使用Web表单进行身份验证显然不太合适，而且，这将不可避免的造成人机交互，使WebService的应用大打折扣。<br />
&nbsp;&nbsp;接下来，我们就分步解决这两个问题：<br />
1.Cookie的保存问题<br />
&nbsp;&nbsp;&nbsp; WebService的客户端代理类有一个属性CookieContainer可用于设置或获取Cookie集合，保存Cookie的任务就交给他了：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">System.Net.CookieContainer&nbsp;cookieContainer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;System.Net.CookieContainer();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />MyService.WebService&nbsp;service&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;App.MyService.WebService();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />service.CookieContainer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cookieContainer;</span></div>
</span><br />
2.我们不想使用Web表单进行身份验证，幸运的是，ASP.Net表单验证中的表单页（即Web.config文件中 forms&nbsp;元素内的loginUrl）同样可以指定为WebService文件。<br />
&nbsp;&nbsp;&nbsp; 我们创建一个专门用作身份验证的Web服务，暂且命名为Login.asmx，然后让 loginUrl 等于 &#8220;Login.asmx&#8221;，当然，还需要在Web.config文件中的 authorization 节中禁止匿名访问（否则我们可就白忙活了），完成配置后的Web.config文件如下：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">system</span><span style="color: #ff0000">.web</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">compilation&nbsp;</span><span style="color: #ff0000">debug</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">authentication&nbsp;</span><span style="color: #ff0000">mode</span><span style="color: #0000ff">="Forms"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forms&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="MyService"</span><span style="color: #ff0000">&nbsp;loginUrl</span><span style="color: #0000ff">="Login.asmx"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">forms</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">authentication</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">authorization&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">deny&nbsp;</span><span style="color: #ff0000">users</span><span style="color: #0000ff">="?"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">authorization</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">system.web</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">configuration</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
&nbsp;&nbsp;&nbsp; 其实我们并不想在未通过身份验证时让浏览器转向到Login.asmx，对于使用WebService的客户程序来说，真正的实惠在于：可以匿名访问Login.asmx中的方法（当然我们也可以把Login.asmx放在单独的目录中，然后允许对该目录的匿名访问来达个这个目的，但我觉得还是用loginUrl更优雅一些）。<br />
&nbsp;&nbsp;&nbsp; 接下来，我们为Login.asmx添加用于身份验证的WebMethod：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">[WebMethod]<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;Check(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;userName,</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;password)<br />
<img id="Codehighlighter1_63_283_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_283_Open_Text.style.display='none'; Codehighlighter1_63_283_Closed_Image.style.display='inline'; Codehighlighter1_63_283_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_63_283_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_63_283_Closed_Text.style.display='none'; Codehighlighter1_63_283_Open_Image.style.display='inline'; Codehighlighter1_63_283_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_63_283_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_63_283_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(userName&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">aaaaaa</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;password&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">123456</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #008000">//</span><span style="color: #008000">添加验证逻辑</span><span style="color: #008000"><br />
<img id="Codehighlighter1_131_238_Open_Image" onclick="this.style.display='none'; Codehighlighter1_131_238_Open_Text.style.display='none'; Codehighlighter1_131_238_Closed_Image.style.display='inline'; Codehighlighter1_131_238_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_131_238_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_131_238_Closed_Text.style.display='none'; Codehighlighter1_131_238_Open_Image.style.display='inline'; Codehighlighter1_131_238_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_131_238_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_131_238_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Web.Security.FormsAuthentication.SetAuthCookie(userName,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
<img id="Codehighlighter1_253_281_Open_Image" onclick="this.style.display='none'; Codehighlighter1_253_281_Open_Text.style.display='none'; Codehighlighter1_253_281_Closed_Image.style.display='inline'; Codehighlighter1_253_281_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_253_281_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_253_281_Closed_Text.style.display='none'; Codehighlighter1_253_281_Open_Image.style.display='inline'; Codehighlighter1_253_281_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_253_281_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_253_281_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp; 最后一步工作就是：让客户程序中的WebService实例与Login实例共享CookieContainer。<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Sample<br />
<img id="Codehighlighter1_13_535_Open_Image" onclick="this.style.display='none'; Codehighlighter1_13_535_Open_Text.style.display='none'; Codehighlighter1_13_535_Closed_Image.style.display='inline'; Codehighlighter1_13_535_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_13_535_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_13_535_Closed_Text.style.display='none'; Codehighlighter1_13_535_Open_Image.style.display='inline'; Codehighlighter1_13_535_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_13_535_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_13_535_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.Net.CookieContainer&nbsp;cookieContainer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;System.Net.CookieContainer();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;Login()<br />
<img id="Codehighlighter1_127_315_Open_Image" onclick="this.style.display='none'; Codehighlighter1_127_315_Open_Text.style.display='none'; Codehighlighter1_127_315_Closed_Image.style.display='inline'; Codehighlighter1_127_315_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_127_315_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_127_315_Closed_Text.style.display='none'; Codehighlighter1_127_315_Open_Image.style.display='inline'; Codehighlighter1_127_315_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_127_315_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_127_315_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyServiceLogin.Login&nbsp;login&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;App.MyServiceLogin.Login();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;login.CookieContainer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cookieContainer;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;login.Check(</span><span style="color: #000000">"</span><span style="color: #000000">aaaaaa</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">123456</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;ShowHelloWorld()<br />
<img id="Codehighlighter1_355_533_Open_Image" onclick="this.style.display='none'; Codehighlighter1_355_533_Open_Text.style.display='none'; Codehighlighter1_355_533_Closed_Image.style.display='inline'; Codehighlighter1_355_533_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_355_533_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_355_533_Closed_Text.style.display='none'; Codehighlighter1_355_533_Open_Image.style.display='inline'; Codehighlighter1_355_533_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_355_533_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_355_533_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyService.WebService&nbsp;service&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;App.MyService.WebService();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service.CookieContainer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cookieContainer;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(service.HelloWorld());<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp; Login()以后再ShowHelloWorld()，你是否看到了我们熟悉的&#8220;Hello World&#8221;？Ok，就这么简单！<br />
<img src ="http://www.cnblogs.com/winner/aggbug/1184115.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37540/" target="_blank">[新闻]微软在台北发布新色鼠标产品</a>]]></description></item><item><title>灵活定义和处理SOAP头消息  </title><link>http://www.cnblogs.com/winner/archive/2008/05/05/1183927.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Mon, 05 May 2008 11:25:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/05/05/1183927.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1183927.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/05/05/1183927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1183927.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1183927.html</trackback:ping><description><![CDATA[&nbsp; XML 文档中编码的数据是该格式的一部分。XML 文档由根 <strong>Envelope</strong> 标记组成，而该标记又由必需的 <strong>Body</strong> 元素和可选的 <strong>Header</strong> 元素组成。<strong>Body</strong> 元素由特定于消息的数据组成。可选的 <strong>Header</strong> 元素可以包含不与特定消息直接相关的附加消息。<strong>Header</strong> 元素的每个子元素都叫做 SOAP 标头。
<p>虽然 SOAP 标头可以包含与该消息相关的数据（因为 SOAP 规范没有严格地定义 SOAP 标头的内容），但是它们通常包含 Web 服务器中基础结构处理的信息。</p>
<p>使用 ASP.NET 创建的 XML Web services 可以定义和操作 SOAP 标头。定义 SOAP 标头是通过定义表示特定 SOAP 标头中数据的类以及从 <MSHelp:link tabindex="0" keywords="frlrfSystemWebServicesProtocolsSoapHeaderClassTopic">SoapHeader</MSHelp:link> 类中派生该类完成的。</p>
<p>创建一个从 SoapHeader 类派生的类，其名称与 SOAP 标头的根元素匹配。 </p>
<p>public class MyHeader : SoapHeader</p>
<p>添加公共字段或属性，与 SOAP 标头中每个元素的名称和它们各自的数据类型匹配。 <br />
例如，在给定以下 SOAP 标头的情况下，其后的类定义一个表示 SOAP 标头的类。 </p>
<p>&lt;soap:Header xmlns:soap="<a href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>"&gt;<br />
&nbsp; &lt;MyHeader xmlns="<a href="http://www.contoso.com/">http://www.contoso.com/</a>"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;Username&gt;MyUsername&lt;/Username&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;Password&gt;MyPassword&lt;/Password&gt;<br />
&nbsp; &lt;/MyHeader&gt;<br />
&lt;/soap:Header&gt;</p>
<p><br />
public class MyHeader : SoapHeader <br />
{<br />
&nbsp;&nbsp; public string Username;<br />
&nbsp;&nbsp; public string Password;<br />
}</p>
<p>在 XML Web services 中处理 SOAP 标头 </p>
<p>将公共成员添加到实现表示 SOAP 标头类型的 XML Web services 的类。 <br />
[WebService(Namespace="<a href="http://www.contoso.com/">http://www.contoso.com/</a>")]<br />
public class MyWebService <br />
{<br />
&nbsp;&nbsp;&nbsp; // Add a member variable of the type deriving from SoapHeader.<br />
&nbsp;&nbsp;&nbsp; public MyHeader myHeaderMemberVariable;<br />
<br />
将 SoapHeader 属性应用于要处理 SOAP 标头的每个 XML Web services 方法。将 SoapHeader 特性的 MemberName 属性设置为第一步中创建的成员变量的名称。&nbsp;<br />
&nbsp;&nbsp;&nbsp; [WebMethod]<br />
&nbsp;&nbsp;&nbsp; [SoapHeader("myHeaderMemberVariable")]<br />
&nbsp;&nbsp;&nbsp; public void MyWebMethod()<br />
<br />
在应用 SoapHeader 特性的每个 XML Web services 方法中，访问在第一步中创建的成员变量以处理在 SOAP 标头中发送的数据。&nbsp;<br />
&nbsp;&nbsp;&nbsp; [WebMethod]<br />
&nbsp;&nbsp;&nbsp; [SoapHeader("myHeaderMemberVariable")]<br />
&nbsp;&nbsp;&nbsp; public void MyWebMethod() <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Process the SoapHeader.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (myHeaderMemberVariable.Username == "admin")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Do something interesting.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>实例：</p>
<p>MyWebService XML Web services 具有一个名为 myHeaderMemberVariable 的成员变量，该成员变量属于从 SoapHeader (MyHeader) 派生的类型并设置为 SoapHeader 特性的 MemberName 属性。另外，将 SoapHeader 特性应用于指定 myHeaderMemberVariable 成员变量的 MyWebMethod XML Web services 方法。在 MyWebMethod XML Web services 方法中，访问 myHeaderMemberVariable 成员变量来获取 SOAP 标头的 Username XML 元素的值。</p>
<p>&lt;%@ WebService Language="C#" Class="MyWebService" %&gt;<br />
using System.Web.Services;<br />
using System.Web.Services.Protocols;</p>
<p>// Define a SOAP header by deriving from the SoapHeader base class.<br />
public class MyHeader : SoapHeader <br />
{<br />
&nbsp;&nbsp;&nbsp; public string Username;<br />
&nbsp;&nbsp;&nbsp; public string Password;<br />
}</p>
<p>[WebService(Namespace="<a href="http://www.contoso.com/">http://www.contoso.com/</a>")]<br />
public class MyWebService <br />
{<br />
&nbsp;&nbsp;&nbsp; // Add a member variable of the type deriving from SoapHeader.<br />
&nbsp;&nbsp;&nbsp; public MyHeader myHeaderMemberVariable;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; // Apply a SoapHeader attribute.<br />
&nbsp;&nbsp;&nbsp; [WebMethod]<br />
&nbsp;&nbsp;&nbsp; [SoapHeader("myHeaderMemberVariable")]<br />
&nbsp;&nbsp;&nbsp; public void MyWebMethod() <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Process the SoapHeader.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (myHeaderMemberVariable.Username == "admin")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Do something interesting.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>生成处理 SOAP 标头的客户端<br />
当与 XML Web services 进行通讯时，XML Web services 客户端可以发送和接收 SOAP 标头。当使用 Wsdl.exe 实用工具为预期或返回 SOAP 标头的 XML Web services 生成代理类时，该代理类包括有关 SOAP 标头的信息。明确地说，代理类具有表示 SOAP 标头的成员变量，这些 SOAP 标头与 XML Web services 中的 SOAP 标头互相关联。代理类也具有表示 SOAP 标头的相应的类的定义。例如，为上面的 XML Web services 生成的代理类将具有一个 MyHeader 类型的成员变量以及 MyHeader 类的定义。</p>
<p>创建表示 SOAP 标头的类的新实例。</p>
<p>MyHeader mySoapHeader = new MyHeader();</p>
<p>为该 SOAP 标头填充值。 </p>
<p>mySoapHeader.Username = "username";<br />
mySoapHeader.Password = "password";</p>
<p>创建该代理类的新实例。 </p>
<p>MyWebService proxy = new MyWebService();</p>
<p>将该 SOAP 标头对象分配到表示 SOAP 标头的代理类的成员变量。 </p>
<p>proxy.MyHeaderValue = mySoapHeader<br />
对与 XML Web services 方法通讯的代理类调用方法。 <br />
发送到 XML Web services 的 SOAP 请求的 SOAP 标头部分将包括存储在 SOAP 标头对象中数据的内容。 </p>
<p>string results = proxy.MyWebMethod();</p>
<p>下面演示如何将 SOAP 标头从客户端传递到 XML Web services。</p>
<p>&lt;%@ Page Language="C#" %&gt;</p>
<p>&lt;asp:Label id="ReturnValue" runat="server" /&gt;<br />
&lt;script runat=server language=c#&gt;</p>
<p>&nbsp;void Page_Load(Object o, EventArgs e)<br />
&nbsp;{</p>
<p>&nbsp; MyHeader mySoapHeader = new MyHeader();</p>
<p>&nbsp; // Populate the values of the SOAP header.<br />
&nbsp; mySoapHeader.Username = "username";<br />
&nbsp; mySoapHeader.Password = "password";</p>
<p>&nbsp; // Create a new instance of the proxy class.<br />
&nbsp; MyWebService proxy = new MyWebService();<br />
&nbsp; <br />
&nbsp; // Add the MyHeader SOAP header to the SOAP request.<br />
&nbsp; proxy.MyHeaderValue = mySoapHeader;</p>
<p>&nbsp; // Call the method on the proxy class that communicates with<br />
&nbsp; // your XML Web service method.<br />
&nbsp; string results = proxy.MyWebMethod();</p>
<p>&nbsp; // Display the results of the method in a label.<br />
&nbsp; ReturnValue.Text = results;<br />
&nbsp;}<br />
&lt;/script&gt;</p>
<img src ="http://www.cnblogs.com/winner/aggbug/1183927.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37540/" target="_blank">[新闻]微软在台北发布新色鼠标产品</a>]]></description></item><item><title>反射技术与设计模式 </title><link>http://www.cnblogs.com/winner/archive/2008/03/31/1131728.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Mon, 31 Mar 2008 12:27:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/03/31/1131728.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1131728.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/03/31/1131728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1131728.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1131728.html</trackback:ping><description><![CDATA[反射技术与设计模式 <br />
<br />
反射（Reflection）是.NET中的重要机制，通过放射，可以在运行时获得.NET中每一个类型（包括类、结构、委托、接口和枚举等）的成员，包括方法、属性、事件，以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射，即可对每一个类型了如指掌。如果获得了构造函数的信息，即可直接创建对象，即使这个对象的类型在编译时还不知道。 <br />
<br />
1、.NET可执行应用程序结构 <br />
<br />
程序代码在编译后生成可执行的应用，我们首先要了解这种可执行应用程序的结构。 <br />
<br />
应用程序结构分为应用程序域—程序集—模块—类型—成员几个层次，公共语言运行库加载器管理应用程序域，这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。 <br />
<br />
程序集包含模块，而模块包含类型，类型又包含成员，反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例，将类型绑定到现有对象或从现有对象中获取类型，然后调用类型的方法或访问其字段和属性。反射通常具有以下用途。 <br />
<br />
（1）使用Assembly定义和加载程序集，加载在程序集清单中列出模块，以及从此程序集中查找类型并创建该类型的实例。 <br />
<br />
（2）使用Module了解包含模块的程序集以及模块中的类等，还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 <br />
<br />
（3）使用ConstructorInfo了解构造函数的名称、参数、访问修饰符（如pulic 或private）和实现详细信息（如abstract或virtual）等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。 <br />
<br />
（4）使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符（如pulic 或private）和实现详细信息（如abstract或virtual）等。使用Type的GetMethods或GetMethod方法来调用特定的方法。 <br />
<br />
（5）使用FiedInfo了解字段的名称、访问修饰符（如public或private）和实现详细信息（如static）等，并获取或设置字段值。 <br />
<br />
（6）使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等，添加或移除事件处理程序。 <br />
<br />
（7）使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等，获取或设置属性值。 <br />
<br />
（8）使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数，以及参数在方法签名中的位置等。 <br />
<br />
System.Reflection.Emit命名空间的类提供了一种特殊形式的反射，可以在运行时构造类型。 <br />
<br />
反射也可用于创建称为类型浏览器的应用程序，使用户能够选择类型，然后查看有关选定类型的信息。 <br />
<br />
此外，Jscript等语言编译器使用反射来构造符号表。System.Runtime.Serialization命名空间中的类使用反射来访问数据并确定要永久保存的字段，System.Runtime.Remoting命名空间中的类通过序列化来间接地使用反射。 <br />
<br />
2、反射技术示例 <br />
<br />
下面是反射技术的示例，我们可以在程序去得时动态实例化对象，获得对象的属性，并调用对象的方法。 <br />
<br />
1Namespace ReflectionExample <br />
2{ <br />
3 class Class1 <br />
4 { <br />
5 [STAThread] <br />
6 static void Main (string [ ] args) <br />
7 { <br />
8 System.Console.WriteLine(&#8220;列出程序集中的所有类型&#8221;); <br />
9 Assembly a = Assembly.LoadFrom (&#8220;ReflectionExample.exe&#8221;); <br />
10 Type[ ] mytypes = a.GetTypes( ); <br />
11 <br />
12 Foreach (Type t in mytypes) <br />
13 { <br />
14 System.Console.WriteLine ( t.Name ); <br />
15 } <br />
16 System.Console.ReadLine ( ); <br />
17 System.Console.WriteLine (&#8220;列出HellWord中的所有方法&#8221; ); <br />
18 Type ht = typeof(HelloWorld); <br />
19 MethodInfo[] mif = ht.GetMethods(); <br />
20 foreach(MethodInfo mf in mif) <br />
21 { <br />
22 System.Console.WriteLine(mf.Name); <br />
23 } <br />
24 System.Console.ReadLine(); <br />
25 System.Console.WriteLine("实例化HelloWorld,并调用SayHello方法"); <br />
26 Object obj = Activator.CreateInstance(ht); <br />
27 string[] s = {"zhenlei"}; <br />
28 Object bojName = Activator.CreateInstance(ht,s); <br />
29 BindingFlags flags = (BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly); <br />
30 MethodInfo msayhello = ht.GetMethod("SayHello"); <br />
31 msayhello.Invoke(obj,null); <br />
32 msayhello.Invoke(objName,null); <br />
33 System.Console.ReadLine(); <br />
34 } <br />
35 } <br />
36} <br />
1using System; <br />
2namespace ReflectionExample <br />
3{ <br />
4 public class HelloWorld <br />
5 { <br />
6 string myName = null; <br />
7 public HelloWorld(string name) <br />
8 { <br />
9 myName = name; <br />
10 } <br />
11 public HelloWorld() : this(null) <br />
12 {} <br />
13 public string Name <br />
14 { <br />
15 get <br />
16 { <br />
17 return myName; <br />
18 } <br />
19 } <br />
20 public void SayHello() <br />
21 { <br />
22 if(myName == null) <br />
23 { <br />
24 System.Console.WriteLine("Hello World"); <br />
25 } <br />
26 else <br />
27 { <br />
28 System.Console.WriteLine("Hello," + myName); <br />
29 } <br />
30 } <br />
31 } <br />
32} <br />
33 <br />
<br />
3、在设计模式实现中使用反射技术 <br />
<br />
采用反射技术可以简化工厂的实现。 <br />
<br />
（1）工厂方法：通过反射可以将需要实现的子类名称传递给工厂方法，这样无须在子类中实现类的实例化。 <br />
<br />
（2）抽象工厂：使用反射可以减少抽象工厂的子类。 <br />
<br />
采用反射技术可以简化工厂代码的复杂程度，在.NET项目中，采用反射技术的工厂已经基本代替了工厂方法。 <br />
<br />
采用反射技术可以极大地简化对象的生成，对以下设计模式的实现也有很大影响。 <br />
<br />
（1）命令模式：可以采用命令的类型名称作为参数直接获得命令的实例，并且可以动态执行命令。 <br />
<br />
（2）享元模式：采用反射技术实例化享元可以简化享元工厂。 <br />
委托技术与设计模式 <br />
<br />
委托技术是.NET引入的一种重要技术，使用委托可以实现对象行为的动态绑定，从而提高设计的灵活性。 <br />
<br />
1、.NET中的委托技术 <br />
<br />
.NET运行库支持称为&#8220;委托&#8221;的引用类型，其作用类似于C++中的函数指针。与函数指针不同，委托实例独立于其封装方法的类，主要是那些方法与委托类型兼容。另外，函数指针只能引用静态函数，而委托可以引用静态和实例方法。委托主要用于.NET Framework中的事件处理程序和回调函数。 <br />
<br />
所有委托都从System.Delegate继承而来并且有一个调用列表，这是在调用委托时所执行方法的一个链接列表。产生的委托可以用匹配的签名引用任何方法，没有为具有返回类型并在调用列表中包含多个方法的委托定义返回值。 <br />
<br />
可以使用的委托Cimbine及Remove方法在其调用列表中添加和移除方法。若要调用委托，可使用Invoke方法，或者使用BeginInvoke和EndInvoke方法异步调用委托。委托类的实现由运行库提供，而不由用户代码提供。 <br />
<br />
委托适用于那种在某些语言中需要用函数指针来解决的情况，但是与函数指针不同，它是面向对象和类型安全的。 <br />
<br />
委托声明定义一个类，它是从System.Delegate类派生的类。委托实例封装了一个调用列表，其中列出了一个或多个方法，每个方法称为一个可调用实体。对于实例方法，可调用实体由一个实例和该实例的方法组成；对于静态方法，可调用实体仅由一个方法组成。如果用一组合适的参数来调用一个委托实例，则该委托实例所封装的每个可调用实体都会被调用，并且使用上述同一组参数。 <br />
<br />
委托实例的一个有用的属性是它既不知道，也不关心其封装方法所属类的详细信息，对它来说最重要的是这些方法与该委托的类型兼容。即只要方法的返回类型和参数表是相同的，则方法与委托类型兼容，方法的名称不一定要与委托类相同。 <br />
<br />
定义和使用委托分为声明、实例化和调用3个步骤。委托用委托声明语法声明，如： <br />
<br />
delegate void myDelegate( ); <br />
<br />
声明一个名为myDelegate的委托，它不带参数并且不返回任何结果，如： <br />
<br />
class Test <br />
{ <br />
static void F( ) <br />
{ <br />
System.Console.WriteLine (&#8220;Test.F&#8221;); <br />
} <br />
static void Main ( ) <br />
{ <br />
myeDelegate d = new myDelegate (F); <br />
d ( ); <br />
} <br />
} <br />
<br />
创建一个myDelegate实例，然后立即调用它。这样做并没有太大的意义，因为直接调用方法会更简单。当涉及其匿名特性时，委托才能真正显示出其效果，如： <br />
<br />
void MultiCall (myDelegate d, int count ) { <br />
for (int I = 0; I &lt; count; I++) { <br />
d( ); <br />
} <br />
} <br />
<br />
显示一个重复调用 myDelegate的MultiCall 方法，这个方法不知道，也不必知道myDelegate的目标方法的类型、该方法具有的可访问性或者是否为静态。对它来说最重要的是目标方法与myDelegate兼容。 <br />
<br />
2、示例 <br />
<br />
下面的例子说明了委托的实现，代码如下： <br />
<br />
1using System; <br />
2namespace DelegateExample <br />
3{ <br />
4 public class TemplateMethod <br />
5 { <br />
6 public delegate float Comp(float a,float b); <br />
7 public Comp myComp; <br />
8 public TemplateMethod() <br />
9 {} <br />
10 public float DoComp(float[] f) <br />
11 { <br />
12 float nf = float.NaN; <br />
13 foreach(float df in f) <br />
14 { <br />
15 if(float.IsNaN(nf)) <br />
16 nf = df; <br />
17 else <br />
18 nf = myComp(nf,df); <br />
19 } <br />
20 return nf; <br />
21 } <br />
22 <br />
23 } <br />
24} <br />
<br />
委托技术与GOF设计模式中委托的关系 <br />
<br />
需要指出的是，.NET中的委托技术与GOF在《设计模式》中所提列的委托的意图一致，但在实现方法上有相当大的区别。.NET中的委托更进一步地降低了对象间的耦合性，将静态的组合关系变为运行时的动态组合关系。 <br />
<br />
GOF在《设计模式》中定义的委托是：&#8220;委托是一种组合方法，它使组合具有与继承同样的复用能力。在委托方式下，有两个对象参与处理一个请求，接受请求的对象将操作委托给它的代理者（delegate），它类似于子类将请求交给它的父类处理。使用继承时，被继承的操作总能引用接受请求的对象。在C++中通过this成员变量，在Smalltalk中则通过self。委托方式为了得到同样的效果，接受请求的对象将自身传给被委托者（代理人），使被委托的操作可以引用接受请求的对象。&#8221; <br />
<br />
如果采用.NET的委托技术，上述结构可以更加灵活。Window不引用Rectangle即可实现Area的计算，为此首先声明一个计算面积的委托定义，示例代码如下： <br />
<br />
public delegate float Darea(); <br />
<br />
然而在Window类中声明与这个代理一致的接口： <br />
<br />
class Window <br />
{ <br />
public Darea Area; <br />
} <br />
<br />
这里不需要引用Rectangle类，只是在执行时动态绑定即可： <br />
<br />
Rectangle rc = new Rectangle(); <br />
Window w = new Window(); <br />
w.Area = new Darea(rc.Area); <br />
<br />
这样当调用w的Area时，实际调用的是Reactangel的Area方法。从实现意图上看，.NET的委托更好地实现了GOF所阐述的意图，结构上也更为灵活。但这两种委托解决的不是一个层面的问题，GOF的委托强调的是一种策略，而.NET和委托技术则是具体实现。 <br />
<br />
委托技术与设计模式实现 <br />
<br />
采用委托技术可以进一步实现用组合代替继承的思路，很多采用继承实现的关系可以采用委托实现。采用委托可以简化下列设计模式的使用。 <br />
<br />
（1）模板方法：这种方法采用继承实现具体方法，采用委托可以动态实现方法的组合。 <br />
<br />
（2）观察者：可以使用事件委托实现观察者与主题之间的通信。 <br />
<br />
（3）中介者：使用委托可以去除工件与中介者之间的耦合关系。</ca>
<img src ="http://www.cnblogs.com/winner/aggbug/1131728.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/37539/" target="_blank">[新闻]Hitwise:雅虎流量来自Google搜索比来自雅虎搜索的还多</a>]]></description></item><item><title>转:C#[Serializable]在C#中的作用-NET 中的对象序列化</title><link>http://www.cnblogs.com/winner/archive/2008/03/25/1120757.html</link><dc:creator>Winner.Net(2007)</dc:creator><author>Winner.Net(2007)</author><pubDate>Tue, 25 Mar 2008 01:51:00 GMT</pubDate><guid>http://www.cnblogs.com/winner/archive/2008/03/25/1120757.html</guid><wfw:comment>http://www.cnblogs.com/winner/comments/1120757.html</wfw:comment><comments>http://www.cnblogs.com/winner/archive/2008/03/25/1120757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/winner/comments/commentRss/1120757.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/winner/services/trackbacks/1120757.html</trackback:ping><description><![CDATA[<div class="tit">&nbsp;</div>
<div class="date">&nbsp;</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">
            <p>为什么要使用序列化？最重要的两个原因是：将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本；按值将对象从一个应用程序域发送至另一个应用程序域。例如，序列化可用于在 ASP.NET 中保存会话状态，以及将对象复制到 Windows 窗体的剪贴板中。它还可用于按值将对象从一个应用程序域远程传递至另一个应用程序域。本文简要介绍了 Microsoft .NET 中使用的序列化。</p>
            <p>一.简介<br />
            &nbsp;&nbsp;&nbsp; 序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中，先将对象的公共字段和私有字段以及类的名称（包括类所在的程序集）转换为字节流，然后再把字节流写入数据流。在随后对对象进行反序列化时，将创建出与原对象完全相同的副本。<br />
            &nbsp;&nbsp;&nbsp; 在面向对象的环境中实现序列化机制时，必须在易用性和灵活性之间进行一些权衡。只要您对此过程有足够的控制能力，就可以使该过程在很大程度上自动进行。例如，简单的二进制序列化不能满足需要，或者，由于特定原因需要确定类中那些字段需要序列化。以下各部分将探讨 .NET 框架提供的可靠的序列化机制，并着重介绍使您可以根据需要自定义序列化过程的一些重要功能。<br />
            二.持久存储<br />
            &nbsp;&nbsp;&nbsp; 我们经常需要将对象的字段值保存到磁盘中，并在以后检索此数据。尽管不使用序列化也能完成这项工作，但这种方法通常很繁琐而且容易出错，并且在需要跟踪对象的层次结构时，会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形，程序员不得不为每一个对象编写代码，以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。<br />
            &nbsp;&nbsp;&nbsp; 公共语言运行时 (CLR) 管理对象在内存中的分布，.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后，类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后，序列化引擎将跟踪所有已序列化的引用对象，以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是，由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable（请参阅基本序列化）。否则，当序列化程序试图序列化未标记的对象时将会出现异常。当反序列化已序列化的类时，将重新创建该类，并自动还原所有数据成员的值。<br />
            三.按值封送<br />
            &nbsp;&nbsp;&nbsp; 对象仅在创建对象的应用程序域中有效。除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable，否则，任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为 Serializable，则该对象将被自动序列化，并从一个应用程序域传输至另一个应用程序域，然后进行反序列化，从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。<br />
            &nbsp;&nbsp;&nbsp; 如果对象是从 MarshalByRefObject 派生得到，则从一个应用程序域传递至另一个应用程序域的是对象引用，而不是对象本身。也可以将从 MarshalByRefObject 派生得到的对象标记为 Serializable。远程使用此对象时，负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程，并用一个代理替换所有从 MarshalByRefObject 派生得到的对象。如果没有预先配置为 SurrogateSelector，序列化体系结构将遵从下面的标准序列化规则（请参阅序列化过程的步骤）。<br />
            四.基本序列化<br />
            <font color="#ff0000">使用二进制格式化程序执行序列化时，一个类的所有成员变量都将被序列化，即使是那些已被标记为私有的变量。</font>在此方面，二进制序列化不同于 XMLSerializer 类，后者只序列化公共字段。<br />
            &nbsp;&nbsp;&nbsp; 要使一个类可序列化，最简单的方法是使用 Serializable 属性对它进行标记，如下所示：<br />
            [Serializable]<br />
            public class MyObject {<br />
            &nbsp;&nbsp; public int n1 = 0;<br />
            &nbsp;&nbsp; public int n2 = 0;<br />
            &nbsp;&nbsp; public String str = null;<br />
            }<br />
            以下代码片段说明了如何将此类的一个实例序列化为一个文件：<br />
            MyObject obj = new MyObject();<br />
            obj.n1 = 1;<br />
            obj.n2 = 24;<br />
            obj.str = "一些字符串";<br />
            IFormatter formatter = new BinaryFormatter();<br />
            Stream stream = new FileStream("MyFile.bin", FileMode.Create, <br />
            FileAccess.Write, FileShare.None);<br />
            formatter.Serialize(stream, obj);<br />
            stream.Close();<br />
            &nbsp;&nbsp;&nbsp; 本例使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例，然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量（甚至标记为 private 的变量）都将被序列化，但这一点在本例中未明确体现出来。在这一点上，二进制序列化不同于只序列化公共字段的 XML 序列化程序。<br />
            将对象还原到它以前的状态也非常容易。首先，创建格式化程序和流以进行读取，然后让格式化程序对对象进行反序列化。以下代码片段说明了如何进行此操作。<br />
            IFormatter formatter = new BinaryFormatter();<br />
            Stream stream = new FileStream("MyFile.bin", FileMode.Open, <br />
            FileAccess.Read, FileShare.Read);<br />
            MyObject obj = (MyObject) formatter.Deserialize(fromStream);<br />
            stream.Close();<br />
            // 下面是证明<br />
            Console.WriteLine("n1: {0}", obj.n1);<br />
            Console.WriteLine("n2: {0}", obj.n2);<br />
            Console.WriteLine("str: {0}", obj.str);<br />
            &nbsp;&nbsp;&nbsp; 上面所使用的 BinaryFormatter 效率很高，能生成非常紧凑的字节流。所有使用此格式化程序序列化的对象也可使用它进行反序列化，对于序列化将在 .NET 平台上进行反序列化的对象，此格式化程序无疑是一个理想工具。需要注意的是，对对象进行反序列化时并不调用构造函数。对反序列化添加这项约束，是出于性能方面的考虑。但是，这违反了对象编写者通常采用的一些运行时约定，因此，开发人员在将对象标记为可序列化时，应确保考虑了这一特殊约定。<br />
            如果要求具有可移植性，请使用 SoapFormatter。所要做的更改只是将以上代码中的格式化程序换成 SoapFormatter，而 Serialize 和 Deserialize 调用不变。对于上面使用的示例，该格式化程序将生成以下结果。<br />
            &lt;SOAP-ENV:Envelope<br />
            &nbsp;&nbsp; xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance<br />
            &nbsp;&nbsp; xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>" <br />
            &nbsp;&nbsp; xmlns:SOAP- ENC=http://schemas.xmlsoap.org/soap/encoding/<br />
            &nbsp;&nbsp; xmlns:SOAP- ENV=http://schemas.xmlsoap.org/soap/envelope/<br />
            &nbsp;&nbsp; SOAP-ENV:encodingStyle=<br />
            &nbsp;&nbsp; "<a href="http://schemas.microsoft.com/soap/encoding/clr/1.0">http://schemas.microsoft.com/soap/encoding/clr/1.0</a><br />
            <a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>"<br />
            &nbsp;&nbsp; xmlns:a1="<a href="http://schemas.microsoft.com/clr/assem/ToFile">http://schemas.microsoft.com/clr/assem/ToFile</a>"&gt;<br />
            &nbsp;&nbsp; &lt;SOAP-ENV:Body&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; &lt;a1:MyObject id="ref-1"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;n1&gt;1&lt;/n1&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;n2&gt;24&lt;/n2&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;str id="ref-3"&gt;一些字符串&lt;/str&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; &lt;/a1:MyObject&gt;<br />
            &nbsp;&nbsp; &lt;/SOAP-ENV:Body&gt;<br />
            &lt;/SOAP-ENV:Envelope&gt;<br />
            &nbsp;&nbsp;&nbsp; 需要注意的是，无法继承 Serializable 属性。如果从 MyObject 派生出一个新的类，则这个新的类也必须使用该属性进行标记，否则将无法序列化。例如，如果试图序列化以下类实例，将会显示一个 SerializationException，说明 MyStuff 类型未标记为可序列化。<br />
            public class MyStuff : MyObject <br />
            {<br />
            &nbsp;&nbsp; public int n3;<br />
            }<br />
            &nbsp;&nbsp;&nbsp; 使用序列化属性非常方便，但是它存在上述的一些限制。有关何时标记类以进行序列化（因为类编译后就无法再序列化），请参考有关说明（请参阅下面的序列化规则）。<br />
            五.选择性序列化<br />
            &nbsp;&nbsp;&nbsp; 类通常包含不应被序列化的字段。例如，假设某个类用一个成员变量来存储线程 ID。当此类被反序列化时，序列化此类时所存储的 ID 对应的线程可能不再运行，所以对这个值进行序列化没有意义。可以通过使用 NonSerialized 属性标记成员变量来防止它们被序列化，如下所示：<br />
            [Serializable]<br />
            public class MyObject <br />
            {<br />
            &nbsp;&nbsp; public int n1;<br />
            &nbsp;&nbsp; [NonSerialized] public int n2;<br />
            &nbsp;&nbsp; public String str;<br />
            }<br />
            六.自定义序列化<br />
            &nbsp;&nbsp;&nbsp; 可以通过在对象上实现 ISerializable 接口来自定义序列化过程。这一功能在反序列化后成员变量的值失效时尤其有用，但是需要为变量提供值以重建对象的完整状态。要实现 ISerializable，需要实现 GetObjectData 方法以及一个特殊的构造函数，在反序列化对象时要用到此构造函数。以下代码示例说明了如何在前一部分中提到的 MyObject 类上实现 ISerializable。<br />
            [Serializable]<br />
            public class MyObject : ISerializable <br />
            {<br />
            &nbsp;&nbsp; public int n1;<br />
            &nbsp;&nbsp; public int n2;<br />
            &nbsp;&nbsp; public String str;<br />
            &nbsp;&nbsp; public MyObject()<br />
            &nbsp;&nbsp; {<br />
            &nbsp;&nbsp; }<br />
            &nbsp;&nbsp; protected MyObject(SerializationInfo info, StreamingContext context)<br />
            &nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp; n1 = info.GetInt32("i");<br />
            &nbsp;&nbsp;&nbsp;&nbsp; n2 = info.GetInt32("j");<br />
            &nbsp;&nbsp;&nbsp;&nbsp; str = info.GetString("k");<br />
            &nbsp;&nbsp; }<br />
            &nbsp;&nbsp; public virtual void GetObjectData(SerializationInfo info, <br />
            StreamingContext context)<br />
            &nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp; info.AddValue("i", n1);<br />
            &nbsp;&nbsp;&nbsp;&nbsp; info.AddValue("j", n2);<br />
            &nbsp;&nbsp;&nbsp;&nbsp; info.AddValue("k", str);<br />
            &nbsp;&nbsp; }<br />
            }<br />
            &nbsp;&nbsp;&nbsp; 在序列化过程中调用 GetObjectData 时，需要填充方法调用中提供的SerializationInfo 对象。只需按名称/值对的形式添加将要序列化的变量。其名称可以是任何文本。只要已序列化的数据足以在反序列化过程中还原对象，便可以自由选择添加至 SerializationInfo 的成员变量。如果基对象实现了 ISerializable，则派生类应调用其基对象的 GetObjectData 方法。 <br />
            &nbsp;&nbsp;&nbsp; 需要强调的是，将 ISerializable 添加至某个类时，需要同时实现 GetObjectData 以及特殊的构造函数。如果缺少 GetObjectData，编译器将发出警告。但是，由于无法强制实现构造函数，所以，缺少构造函数时不会发出警告。如果在没有构造函数的情况下尝试反序列化某个类，将会出现异常。在消除潜在安全性和版本控制问题等方面，当前设计优于SetObjectData 方法。例如，如果将 SetObjectData 方法定义为某个接口的一部分，则此方法必须是公共方法，这使得用户不得不编写代码来防止多次调用 SetObjectData 方法。可以想象，如果某个对象正在执行某些操作，而某个恶意应用程序却调用此对象的 SetObjectData 方法，将会引起一些潜在的麻烦。<br />
            &nbsp;&nbsp;&nbsp; 在反序列化过程中，使用出于此目的而提供的构造函数将 SerializationInfo 传递给类。对象反序列化时，对构造函数的任何可见性约束都将被忽略，因此，可以将类标记为 public、protected、internal 或 private。一个不错的办法是，在类未封装的情况下，将构造函数标记为 protect。如果类已封装，则应标记为 private。要还原对象的状态，只需使用序列化时采用的名称，从 SerializationInfo 中检索变量的值。如果基类实现了 ISerializable，则应调用基类的构造函数，以使基础对象可以还原其变量。<br />
            &nbsp;&nbsp;&nbsp; 如果从实现了 ISerializable 的类派生出一个新的类，则只要新的类中含有任何需要序列化的变量，就必须同时实现构造函数以及 GetObjectData 方法。以下代码片段显示了如何使用上文所示的 MyObject 类来完成此操作。<br />
            [Serializable]<br />
            public class ObjectTwo : MyObject<br />
            {<br />
            &nbsp;&nbsp; public int num;<br />
            &nbsp;&nbsp; public ObjectTwo() : base()<br />
            &nbsp;&nbsp; {<br />
            &nbsp;&nbsp; }<br />
            &nbsp;&nbsp; protected ObjectTwo(SerializationInfo si, StreamingContext context) : <br />
            base(si,context)<br />
            &nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp; num = si.GetInt32("num");<br />
            &nbsp;&nbsp; }<br />
            &nbsp;&nbsp; public override void GetObjectData(SerializationInfo si, <br />
            StreamingContext context)<br />
            &nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp; base.GetObjectData(si,context);<br />
            &nbsp;&nbsp;&nbsp;&nbsp; si.AddValue("num", num);<br />
            &nbsp;&nbsp; }<br />
            }<br />
            &nbsp;&nbsp;&nbsp; 切记要在反序列化构造函数中调用基类，否则，将永远不会调用基类上的构造函数，并且在反序列化后也无法构建完整的对象。对象被彻底重新构建，但是在反系列化过程中调用方法可能会带来不良的副作用,因为被调用的方法可能引用了在调用时尚未反序列化的对象引用。如果正在进行反序列化的类实现了 IDeserializationCallback，则反序列化整个对象图表后，将自动调用 OnSerialization 方法。此时，引用的所有子对象均已完全还原。有些类不使用上述事件侦听器，很难对它们进行反序列化，散列表便是一个典型的例子。在反序列化过程中检索关键字/值对非常容易，但是，由于无法保证从散列表派生出的类已反序列化，所以把这些对象添加回散列表时会出现一些问题。因此，建议目前不要在散列表上调用方法。<br />
            七.序列化过程的步骤<br />
            &nbsp;&nbsp;&nbsp; 在格式化程序上调用 Serialize 方法时，对象序列化按照以下规则进行：<br />
            检查格式化程序是否有代理选取器。如果有，检查代理选取器是否处理指定类型的对象。如果选取器处理此对象类型，将在代理选取器上调用 ISerializable.GetObjectData。 <br />
            如果没有代理选取器或有却不处理此类型，将检查是否使用 Serializable 属性对对象进行标记。如果未标记，将会引发 SerializationException。 <br />
            如果对象已被正确标记，将检查对象是否实现了 ISerializable。如果已实现，将在对象上调用 GetObjectData。 <br />
            如果对象未实现 Serializable，将使用默认的序列化策略，对所有未标记为 NonSerialized 的字段都进行序列化。 八.版本控制<br />
            &nbsp;&nbsp;&nbsp; .NET 框架支持版本控制和并排执行，并且，如果类的接口保持一致，所有类均可跨版本工作。由于序列化涉及的是成员变量而非接口，所以，在向要跨版本序列化的类中添加成员变量，或从中删除变量时，应谨慎行事。特别是对于未实现 ISerializable 的类更应如此。若当前版本的状态发生了任何变化（例如添加成员变量、更改变量类型或更改变量名称），都意味着如果同一类型的现有对象是使用早期版本进行序列化的，则无法成功对它们进行反序列化。<br />
            如果对象的状态需要在不同版本间发生改变，类的作者可以有两种选择：<br />
            实现 ISerializable。这使您可以精确地控制序列化和反序列化过程，在反序列化过程中正确地添加和解释未来状态。 <br />
