<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Ants'  Blog</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/35955/rss</id><updated>2011-12-15T10:04:07Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/35955/rss"/><entry><id>http://www.cnblogs.com/leleroyn/archive/2011/08/23/2150408.html</id><title type="text">javascript 获取 URL 的 queryString</title><summary type="text">function GetQueryString(name) { var reg = new RegExp(&amp;quot;(^|&amp;amp;)&amp;quot; + name + &amp;quot;=([^&amp;amp;]*)(&amp;amp;|$)&amp;quot;); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; }</summary><published>2011-08-23T04:18:00Z</published><updated>2011-08-23T04:18:00Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leleroyn/archive/2011/08/23/2150408.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/archive/2011/08/23/2150408.html"/><content type="html">&lt;p&gt;function GetQueryString(name) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var reg = new RegExp("(^|&amp;amp;)" + name + "=([^&amp;amp;]*)(&amp;amp;|$)");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var r = window.location.search.substr(1).match(reg);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (r != null) return unescape(r[2]); return null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;/p&gt;&lt;img src="http://www.cnblogs.com/leleroyn/aggbug/2150408.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leleroyn/archive/2011/08/23/2150408.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leleroyn/archive/2011/07/06/2099289.html</id><title type="text">C#取汉字首字母</title><summary type="text">#region 取中文首字母 public static string GetFirstLetter(string paramChinese) { string strTemp = &amp;quot;&amp;quot;; int iLen = paramChinese.Length; int i = 0; for (i = 0; i &amp;lt;= iLen - 1; i++) { strTemp += GetCharSpellCode...</summary><published>2011-07-06T07:51:00Z</published><updated>2011-07-06T07:51:00Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leleroyn/archive/2011/07/06/2099289.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/archive/2011/07/06/2099289.html"/><content type="html">&lt;pre &gt;#region 取中文首字母&#xD;
        public static string GetFirstLetter(string paramChinese)&#xD;
        {&#xD;
            string strTemp = "";&#xD;
            int iLen = paramChinese.Length;&#xD;
            int i = 0;&#xD;
&#xD;
            for (i = 0; i &amp;lt;= iLen - 1; i++)&#xD;
            {&#xD;
                strTemp += GetCharSpellCode(paramChinese.Substring(i, 1));&#xD;
            }&#xD;
&#xD;
            return strTemp;&#xD;
&#xD;
        }&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt; &#xD;
        /// 得到一个汉字的拼音第一个字母，如果是一个英文字母则直接返回大写字母 &#xD;
        /// &amp;lt;/summary&amp;gt; &#xD;
        /// &amp;lt;param name="CnChar"&amp;gt;单个汉字&amp;lt;/param&amp;gt; &#xD;
        /// &amp;lt;returns&amp;gt;单个大写字母&amp;lt;/returns&amp;gt; &#xD;
        private static string GetCharSpellCode(string paramChar)&#xD;
        {&#xD;
            long iCnChar;&#xD;
&#xD;
            byte[] ZW = System.Text.Encoding.Default.GetBytes(paramChar);&#xD;
&#xD;
            //如果是字母，则直接返回 &#xD;
            if (ZW.Length == 1)&#xD;
            {&#xD;
                return paramChar.ToUpper();&#xD;
            }&#xD;
            else&#xD;
            {&#xD;
                // get the array of byte from the single char &#xD;
                int i1 = (short)(ZW[0]);&#xD;
                int i2 = (short)(ZW[1]);&#xD;
                iCnChar = i1 * 256 + i2;&#xD;
            }&#xD;
&#xD;
            //expresstion &#xD;
            //table of the constant list &#xD;
            // 'A'; //45217..45252 &#xD;
            // 'B'; //45253..45760 &#xD;
            // 'C'; //45761..46317 &#xD;
            // 'D'; //46318..46825 &#xD;
            // 'E'; //46826..47009 &#xD;
            // 'F'; //47010..47296 &#xD;
            // 'G'; //47297..47613 &#xD;
&#xD;
            // 'H'; //47614..48118 &#xD;
            // 'J'; //48119..49061 &#xD;
            // 'K'; //49062..49323 &#xD;
            // 'L'; //49324..49895 &#xD;
            // 'M'; //49896..50370 &#xD;
            // 'N'; //50371..50613 &#xD;
            // 'O'; //50614..50621 &#xD;
            // 'P'; //50622..50905 &#xD;
            // 'Q'; //50906..51386 &#xD;
&#xD;
            // 'R'; //51387..51445 &#xD;
            // 'S'; //51446..52217 &#xD;
            // 'T'; //52218..52697 &#xD;
            //没有U,V &#xD;
            // 'W'; //52698..52979 &#xD;
            // 'X'; //52980..53640 &#xD;
            // 'Y'; //53689..54480 &#xD;
            // 'Z'; //54481..55289 &#xD;
&#xD;
            // iCnChar match the constant &#xD;
            if ((iCnChar &amp;gt;= 45217) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 45252))&#xD;
            {&#xD;
                return "A";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 45253) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 45760))&#xD;
            {&#xD;
                return "B";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 45761) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 46317))&#xD;
            {&#xD;
                return "C";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 46318) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 46825))&#xD;
            {&#xD;
                return "D";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 46826) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 47009))&#xD;
            {&#xD;
                return "E";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 47010) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 47296))&#xD;
            {&#xD;
                return "F";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 47297) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 47613))&#xD;
            {&#xD;
                return "G";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 47614) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 48118))&#xD;
            {&#xD;
                return "H";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 48119) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 49061))&#xD;
            {&#xD;
                return "J";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 49062) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 49323))&#xD;
            {&#xD;
                return "K";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 49324) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 49895))&#xD;
            {&#xD;
                return "L";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 49896) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 50370))&#xD;
            {&#xD;
                return "M";&#xD;
            }&#xD;
&#xD;
            else if ((iCnChar &amp;gt;= 50371) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 50613))&#xD;
            {&#xD;
                return "N";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 50614) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 50621))&#xD;
            {&#xD;
                return "O";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 50622) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 50905))&#xD;
            {&#xD;
                return "P";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 50906) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 51386))&#xD;
            {&#xD;
                return "Q";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 51387) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 51445))&#xD;
            {&#xD;
                return "R";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 51446) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 52217))&#xD;
            {&#xD;
                return "S";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 52218) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 52697))&#xD;
            {&#xD;
                return "T";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 52698) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 52979))&#xD;
            {&#xD;
                return "W";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 52980) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 53688))&#xD;
            {&#xD;
                return "X";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 53689) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 54480))&#xD;
            {&#xD;
                return "Y";&#xD;
            }&#xD;
            else if ((iCnChar &amp;gt;= 54481) &amp;amp;&amp;amp; (iCnChar &amp;lt;= 55289))&#xD;
            {&#xD;
                return "Z";&#xD;
            }&#xD;
            else return ("?");&#xD;
        }&#xD;
&#xD;
        #endregion&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/leleroyn/aggbug/2099289.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leleroyn/archive/2011/07/06/2099289.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leleroyn/archive/2011/03/24/1993627.html</id><title type="text">解决“找不到请求的 .Net Framework 数据提供程序。可能没有安装”的问题</title><summary type="text">在使用subsonic 3时，如果不完整安装SQLite的SDK包，直接在项目中使用System.Data.SQLite将引发上述错误。原因是：是 DBproviderfacotories 没有导致 解决的办法是手动在配制文件中指定 ，代码如下 ：1&amp;lt;system.data&amp;gt;2&amp;lt;DbProviderFactories&amp;gt;3&amp;lt;removeinvariant=&amp;quot;System.Data.SQLite&amp;quot;/&amp;gt;4&amp;lt;addname=&amp;quot;SQLiteDataProvider&amp;quot;invariant=&amp;quot;System.Data.S</summary><published>2011-03-24T04:05:00Z</published><updated>2011-03-24T04:05:00Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leleroyn/archive/2011/03/24/1993627.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/archive/2011/03/24/1993627.html"/><content type="html">&lt;p&gt;在使用subsonic 3时，如果不完整安装SQLite的SDK包，直接在项目中使用System.Data.SQLite将引发上述错误。&lt;/p&gt;&lt;p&gt;原因是：是 DBproviderfacotories 没有导致 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;解决的办法是手动在配制文件中指定 ，代码如下 ：&lt;/p&gt;&lt;br /&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.data&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;DbProviderFactories&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;remove&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;invariant&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="System.Data.SQLite"&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;add&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="SQLite&amp;nbsp;Data&amp;nbsp;Provider"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;invariant&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="System.Data.SQLite"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;description&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=".Net&amp;nbsp;Framework&amp;nbsp;Data&amp;nbsp;Provider&amp;nbsp;for&amp;nbsp;SQLite"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;="System.Data.SQLite.SQLiteFactory,&amp;nbsp;System.Data.SQLite"&lt;/span&gt;&lt;span style="color: #FF0000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;DbProviderFactories&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.data&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leleroyn/aggbug/1993627.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leleroyn/archive/2011/03/24/1993627.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leleroyn/archive/2011/02/25/1965016.html</id><title type="text">IIS Express的安装与设置讲解</title><summary type="text">最近在做一些Web方面调研的时候我基本上都不用 IIS了，IIS Express 实在是很方便，由于目前还是 BETA版本，有些功能界面上还看不见，网上资料也很少，所以我把我之前的一点经验写出来。关注 IIS Express 的最初原因是希望将我们的一个产品部署到 Windows XP Professional上，要知道 2003 Server的价格和 Pro差距还是很大的，对于大批量部署的产品来...</summary><published>2011-02-25T08:31:00Z</published><updated>2011-02-25T08:31:00Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leleroyn/archive/2011/02/25/1965016.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/archive/2011/02/25/1965016.html"/><content type="html">&lt;p&gt;最近在做一些Web方面调研的时候我基本上都不用 IIS了，IIS Express 实在是很方便，由于目前还是 BETA版本，有些功能界面上还看不见，网上资料也很少，所以我把我之前的一点经验写出来。&lt;br&gt;关注 IIS Express 的最初原因是希望将我们的一个产品部署到 Windows XP Professional上，要知道 2003 Server的价格和 Pro差距还是很大的，对于大批量部署的产品来说，这对产品利润影响相当大。由于我们在开发时使用了 MVC，这个在 XP Pro自带的 IIS5.1上部署，一方面程序要做相应的处理，还需要部署 URL Rewriter之类的东西，相当麻烦，解决了服务器费用，只怕又会带来开发人员出差的费用。&lt;br&gt;有了 IIS Express，问题基本可全部解决，主要关注的是下面的几个问题：&lt;br&gt;1. 允许远程访问&lt;br&gt;2. 要可以支持创建虚拟目录&lt;br&gt;3. 可以支持运行多个 Web Application&lt;br&gt;4. 我们的产品是在学校的局域网部署，性能上应满足至少几十人并发要求&lt;br&gt;1. 安装部署&lt;br&gt;下载地址：http://www.microsoft.com/web/webmatrix/ , IIS Express 是随 Web Matrix 一起发布的，安装Microsoft Web Platform Installer 后，就可以选择安装 IIS Express（英文版中有 IIS Express可以选择，中文版中直接选 Web Matrix）。&lt;br&gt;介绍可参考Scott博客：http://weblogs.asp.net/scottgu/archive/2010/06/28/introducing-iis-express.aspx&lt;br&gt;IIS Express overview：http://learn.iis.net/page.aspx/868/iis-developer-express-overview/&lt;br&gt;从开始菜单运行 Web Matrix 后默认会自动启动一个Web 站点，管理界面比较简单，可以直接将某个目录创建为Web站点。&lt;br&gt;实际我在使用的时候，基本都是以命令行方式运行的，一般我只用到下面几个参数：&lt;br&gt;iisexpress [/config:config-file] [/site:site-name] [/systray:boolean]&lt;br&gt; 配置文件可直接基于默认的配置文件修改， 默认使用的配置文件是在 [我的文档]\IISExpress8\config\applicationhost.config&lt;br&gt;我现在的用法是直接将 Web Matrix所在目录打包放到光盘上，配置文件随应用程序发布，然后分别创建两个批处理文件，用以启动和停止IIS Express服务，非常方便，批处理内容大概就像这样：&lt;br&gt;启动：start F:\Projects\MicrosoftWebMatrix\iisexpress /config:F:\Projects\XXX\applicationhost.config /systray:true /site:MTLOralDemo&lt;br&gt;停止：TASKKILL /F /IM iisexpress.exe /T&lt;br&gt;其他机器根本不需要再安装Web Matrix,，只要装了.Net Framework直接运行就可以了。&lt;br&gt;2. 远程访问设置&lt;br&gt;找到配置文件中 sites\site\bindings 默认是绑定到 localhost 80端口，如果需要其他机器可以访问，绑定到指定IP地址就可以了。&lt;br&gt; &amp;lt;binding protocol="http" bindingInformation="*:8080:192.168.79.166" /&amp;gt;&lt;br&gt;3. 虚拟目录设置&lt;br&gt;类似于下面这样：&lt;br&gt;&amp;lt;site name="AppService" id="1280170558"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;application path="/" applicationPool="Clr2IntegratedAppPool"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;virtualDirectory path="/" physicalPath="C:\IISExpress\DemoApp\empty" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/application&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;application path="/AppService" applicationPool="Clr2IntegratedAppPool"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;virtualDirectory path="/" physicalPath="C:\IISExpress\DemoApp\AppService" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/application&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bindings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;binding protocol="http" bindingInformation="*:8088:192.168.79.166" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bindings&amp;gt;&lt;br&gt;&amp;lt;/site&amp;gt;&lt;br&gt;我尝试过多个virtualDirectory节点，但发现Web Application不能正常工作，而且多个虚拟目录也不是使用独立的 Web.config，后来通过配置application 解决。&lt;br&gt;如果站点有Spring之类的东西，运行时会出现错误，请将 applicationPool 配置成 Clr2ClassicAppPool。&lt;br&gt;4. 配置多个站点&lt;br&gt;多个站点只要配置多个 site 节点就可以了，具体配置都差不多，但多个站点需要使用不同的端口。&lt;br&gt;如果需要同时运行多个站点，在批处理中再增加几条修改相应的参数就行了，相当于同时运行多个 iis express 实例。&lt;br&gt;5. 性能测试结果&lt;br&gt;分别做了以下测试，测试结果性能满足要求：&lt;br&gt;1. 写了个简单测试页面，使用Load Runner 进行200路并发压力测试，进行了2小时。&lt;br&gt;2. 正式产品部署，我们的产品总共运行了9个 iis express进程，分别侦听在8080~8089端口，我们整个部门几十个人同时模拟用户访问站点并实际使用。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leleroyn/aggbug/1965016.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leleroyn/archive/2011/02/25/1965016.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leleroyn/archive/2011/01/14/1935676.html</id><title type="text">控制&amp;lsquo;控制台应用程序&amp;rsquo;的关闭操作</title><summary type="text">控制台程序足够简洁，但是，经常会点错而误关闭。而且，如果系统关闭，或者用户注销，这时候任务还没完成的话，前面的运算电费就白出了。 有没有办法和WinForm一样，对控制台的退出事件进行控制呢？有的！ 引入下面的函数 委托HandlerRoutine，就是把函数的指针传递给系统API函数SetConsoleCtrlHandler。这是个典型的回调函数。 然后在Main方法中调用 HandlerRou...</summary><published>2011-01-14T07:59:00Z</published><updated>2011-01-14T07:59:00Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leleroyn/archive/2011/01/14/1935676.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/archive/2011/01/14/1935676.html"/><content type="html">&lt;p&gt;控制台程序足够简洁，但是，经常会点错而误关闭。而且，如果系统关闭，或者用户注销，这时候任务还没完成的话，前面的运算电费就白出了。 &lt;br&gt;有没有办法和WinForm一样，对控制台的退出事件进行控制呢？有的！ &lt;br&gt;引入下面的函数 &lt;pre&gt;&lt;b&gt;public&lt;/b&gt; &lt;b&gt;delegate&lt;/b&gt; &lt;b&gt;bool&lt;/b&gt; HandlerRoutine(&lt;b&gt;int&lt;/b&gt; dwCtrlType);&#xD;
&#xD;
[DllImport(&lt;b&gt;"kernel32.dll"&lt;/b&gt;, CharSet = CharSet.Auto)]&#xD;
&lt;b&gt;public&lt;/b&gt; &lt;b&gt;static&lt;/b&gt; &lt;b&gt;extern&lt;/b&gt; &lt;b&gt;bool&lt;/b&gt; SetConsoleCtrlHandler(HandlerRoutine HandlerRoutine, &lt;b&gt;bool&lt;/b&gt; add);&lt;/pre&gt;&#xD;
&lt;p&gt;委托HandlerRoutine，就是把函数的指针传递给系统API函数SetConsoleCtrlHandler。这是个典型的回调函数。 &lt;br&gt;然后在Main方法中调用 &lt;pre&gt;Program p = &lt;b&gt;new&lt;/b&gt; Program();&#xD;
&lt;b&gt;if&lt;/b&gt; (!SetConsoleCtrlHandler(p.HandlerRoutineMethod, &lt;b&gt;true&lt;/b&gt;))&#xD;
{&#xD;
    Console.WriteLine(&lt;b&gt;"Unable to install event handler!\n"&lt;/b&gt;);&#xD;
}&lt;/pre&gt;&lt;pre&gt;&lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; CTRL_C_EVENT = 0;&#xD;
    &lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; CTRL_BREAK_EVENT = 1;&#xD;
    &lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; CTRL_CLOSE_EVENT = 2;&#xD;
    &lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; CTRL_LOGOFF_EVENT = 5;&#xD;
    &lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; CTRL_SHUTDOWN_EVENT = 6;&#xD;
&#xD;
    &lt;b&gt;public&lt;/b&gt; &lt;b&gt;bool&lt;/b&gt; HandlerRoutineMethod(&lt;b&gt;int&lt;/b&gt; dwCtrlType)&#xD;
    {&#xD;
        Console.WriteLine(dwCtrlType.ToString());&#xD;
        &lt;b&gt;switch&lt;/b&gt; (dwCtrlType)&#xD;
        {&#xD;
            &lt;b&gt;case&lt;/b&gt; CTRL_C_EVENT:&#xD;
                &lt;b&gt;return&lt;/b&gt; &lt;b&gt;true&lt;/b&gt;;&#xD;
            &lt;b&gt;case&lt;/b&gt; CTRL_BREAK_EVENT:&#xD;
                &lt;b&gt;return&lt;/b&gt; &lt;b&gt;false&lt;/b&gt;;&#xD;
            &lt;b&gt;case&lt;/b&gt; CTRL_CLOSE_EVENT:&#xD;
                Console.WriteLine(&lt;b&gt;"确实要退出程序么？如果需要退出，请输入'exit'。"&lt;/b&gt;);&#xD;
                &lt;b&gt;return&lt;/b&gt; &lt;b&gt;true&lt;/b&gt;;&#xD;
            &lt;b&gt;case&lt;/b&gt; CTRL_LOGOFF_EVENT:&#xD;
                &lt;b&gt;//用户退出&#xD;
&lt;/b&gt;                &lt;b&gt;return&lt;/b&gt; &lt;b&gt;false&lt;/b&gt;;&#xD;
            &lt;b&gt;case&lt;/b&gt; CTRL_SHUTDOWN_EVENT:&#xD;
                &lt;b&gt;//系统关闭&#xD;
&lt;/b&gt;                &lt;b&gt;return&lt;/b&gt; &lt;b&gt;false&lt;/b&gt;;&#xD;
        }&#xD;
        &lt;b&gt;return&lt;/b&gt; &lt;b&gt;true&lt;/b&gt;;&#xD;
    }&lt;/pre&gt;&#xD;
&lt;p&gt;HandlerRoutineMethod函数，就是系统的真实回调。如果返回的结果为false,则程序关闭，否则，不会关闭。 &lt;br&gt;这里只在CTRL_BREAK_EVENT(按下Ctrl+Break)，CTRL_LOGOFF_EVENT用户退出，和系统关闭 CTRL_SHUTDOWN_EVENT，事件时，调用了return false,也就是说，这个时候会关闭。但是在关闭之前我们可以做一些操作。 &lt;br&gt;试想这样的情况，这个任务可能需要运行很长时间，要能在程序关闭的时候有个保存当前进度的方法，那么就可以采用以上操作了。 &lt;br&gt;来看个完整的代码 &#xD;
&lt;p&gt;&lt;pre&gt;&lt;b&gt;class&lt;/b&gt; Program&#xD;
{&#xD;
    &lt;b&gt;static&lt;/b&gt; &lt;b&gt;void&lt;/b&gt; Main(&lt;b&gt;string&lt;/b&gt;[] args)&#xD;
    {&#xD;
        Program p = &lt;b&gt;new&lt;/b&gt; Program();&#xD;
        &lt;b&gt;if&lt;/b&gt; (!SetConsoleCtrlHandler(p.HandlerRoutineMethod, &lt;b&gt;true&lt;/b&gt;))&#xD;
        {&#xD;
            Console.WriteLine(&lt;b&gt;"无法注册系统事件!\n"&lt;/b&gt;);&#xD;
        }&#xD;
&#xD;
        &lt;b&gt;while&lt;/b&gt; (&lt;b&gt;true&lt;/b&gt;)&#xD;
        {&#xD;
            &lt;b&gt;string&lt;/b&gt; s = Console.ReadLine();&#xD;
            &lt;b&gt;if&lt;/b&gt; (s == &lt;b&gt;"exit"&lt;/b&gt;)&#xD;
                GenerateConsoleCtrlEvent(p.CTRL_BREAK_EVENT, 0);&#xD;
        }&#xD;
    }&#xD;
&#xD;
    &lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; CTRL_C_EVENT = 0;&#xD;
    &lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; CTRL_BREAK_EVENT = 1;&#xD;
    &lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; CTRL_CLOSE_EVENT = 2;&#xD;
    &lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; CTRL_LOGOFF_EVENT = 5;&#xD;
    &lt;b&gt;const&lt;/b&gt; &lt;b&gt;int&lt;/b&gt; CTRL_SHUTDOWN_EVENT = 6;&#xD;
&#xD;
    &lt;b&gt;public&lt;/b&gt; &lt;b&gt;bool&lt;/b&gt; HandlerRoutineMethod(&lt;b&gt;int&lt;/b&gt; dwCtrlType)&#xD;
    {&#xD;
        Console.WriteLine(dwCtrlType.ToString());&#xD;
        &lt;b&gt;switch&lt;/b&gt; (dwCtrlType)&#xD;
        {&#xD;
            &lt;b&gt;case&lt;/b&gt; CTRL_C_EVENT:&#xD;
                &lt;b&gt;return&lt;/b&gt; &lt;b&gt;true&lt;/b&gt;;&#xD;
            &lt;b&gt;case&lt;/b&gt; CTRL_BREAK_EVENT:&#xD;
                Save();&#xD;
                &lt;b&gt;return&lt;/b&gt; &lt;b&gt;false&lt;/b&gt;;&#xD;
            &lt;b&gt;case&lt;/b&gt; CTRL_CLOSE_EVENT:&#xD;
                Console.WriteLine(&lt;b&gt;"确实要退出程序么？如果需要退出，请输入'exit'。"&lt;/b&gt;);&#xD;
                &lt;b&gt;return&lt;/b&gt; &lt;b&gt;true&lt;/b&gt;;&#xD;
            &lt;b&gt;case&lt;/b&gt; CTRL_LOGOFF_EVENT:&#xD;
                &lt;b&gt;//用户退出&#xD;
&lt;/b&gt;                Save();&#xD;
                &lt;b&gt;return&lt;/b&gt; &lt;b&gt;false&lt;/b&gt;;&#xD;
            &lt;b&gt;case&lt;/b&gt; CTRL_SHUTDOWN_EVENT:&#xD;
                &lt;b&gt;//系统关闭&#xD;
&lt;/b&gt;                Save();&#xD;
                &lt;b&gt;return&lt;/b&gt; &lt;b&gt;false&lt;/b&gt;;&#xD;
        }&#xD;
        &lt;b&gt;return&lt;/b&gt; &lt;b&gt;true&lt;/b&gt;;&#xD;
    }&#xD;
&#xD;
    &lt;b&gt;void&lt;/b&gt; Save()&#xD;
    {&#xD;
        &lt;b&gt;//保存当前进度&#xD;
&lt;/b&gt;    }&#xD;
&#xD;
    &lt;b&gt;public&lt;/b&gt; &lt;b&gt;delegate&lt;/b&gt; &lt;b&gt;bool&lt;/b&gt; HandlerRoutine(&lt;b&gt;int&lt;/b&gt; dwCtrlType);&#xD;
&#xD;
    [DllImport(&lt;b&gt;"kernel32.dll"&lt;/b&gt;, CharSet = CharSet.Auto)]&#xD;
    &lt;b&gt;public&lt;/b&gt; &lt;b&gt;static&lt;/b&gt; &lt;b&gt;extern&lt;/b&gt; &lt;b&gt;bool&lt;/b&gt; SetConsoleCtrlHandler(HandlerRoutine HandlerRoutine, &lt;b&gt;bool&lt;/b&gt; add);&#xD;
&#xD;
    [DllImport(&lt;b&gt;"kernel32.dll"&lt;/b&gt;, CharSet = CharSet.Auto)]&#xD;
    &lt;b&gt;public&lt;/b&gt; &lt;b&gt;static&lt;/b&gt; &lt;b&gt;extern&lt;/b&gt; &lt;b&gt;bool&lt;/b&gt; GenerateConsoleCtrlEvent(&lt;b&gt;int&lt;/b&gt; code, &lt;b&gt;int&lt;/b&gt; value);&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;先 是用SetConsoleCtrlHandler方法，设置了HandlerRoutineMethod为他的回调函数。那么当有事件过来的时候，会先调用这个方法。这个方法return false，则窗体关闭，true，则窗体不关闭。 &lt;br&gt;GenerateConsoleCtrlEvent方法是通知系统事件的。我们这里假设，只有用户输入exit,或者按Ctrl+Break的时候程序退出。对于用户退出和系统关闭，只是保存当前进度。 &lt;br&gt;在while 循环中，如果用户输入exit命令，则通知系统调用回调函数HandlerRoutineMethod，调用的事件是Ctrl+Break。 &lt;br&gt;现在控制台是不是比以前好用了很多呢？:) &#xD;
&lt;img src="http://www.cnblogs.com/leleroyn/aggbug/1935676.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leleroyn/archive/2011/01/14/1935676.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leleroyn/archive/2010/12/31/1922924.html</id><title type="text">使用Nginx的proxy_cache缓存功能取代Squid</title><summary type="text">[原文链接：http://blog.s135.com/nginx_cache/]　　Nginx从0.7.48版本开始，支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key，用md5编码哈希后保存在硬盘上，所以它可以支持任意URL链接，同时也支持404/301/302这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间，不支持类似Squ...</summary><published>2010-12-31T04:03:00Z</published><updated>2010-12-31T04:03:00Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leleroyn/archive/2010/12/31/1922924.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/archive/2010/12/31/1922924.html"/><content type="html">&lt;p&gt;[原文链接：&lt;a href="http://blog.s135.com/nginx_cache/"&gt;http://blog.s135.com/nginx_cache/&lt;/a&gt;]&lt;br&gt;　　Nginx从0.7.48版本开始，支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key，用md5编码哈希后保存在硬盘上，所以它可以支持任意URL链接，同时也支持404/301/302这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间，不支持类似Squid的PURGE指令，手动清除指定缓存页面，但是，通过一个第三方的Nginx模块，可以清除指定URL的缓存。&lt;br&gt;　　Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成，前者用于反向代理时，对后端内容源服务器进行缓存，后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。&lt;br&gt;　　最新的Nginx 0.8.32版本，proxy_cache和fastcgi_cache已经比较完善，加上第三方的ngx_cache_purge模块（用于清除指定URL的缓存），已经可以完全取代Squid。我们已经在生产环境使用了 Nginx 的 proxy_cache 缓存功能超过两个月，十分稳定，速度不逊于 Squid。&lt;br&gt;　　在功能上，Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。而在性能上，Nginx对多核CPU的利用，胜过Squid不少。另外，在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上，Nginx也比Squid强大得多。这使得一台Nginx可以同时作为“负载均衡服务器”与“Web缓存服务器”来使用。 &lt;hr&gt; &lt;br&gt;　　1、Nginx 负载均衡与缓存服务器在 Linux 下的编译安装： &lt;p&gt;ulimit -SHn 65535&lt;br&gt;wget &lt;a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.gz"&gt;ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.gz&lt;/a&gt;&lt;br&gt;tar zxvf pcre-8.00.tar.gz&lt;br&gt;cd pcre-8.00/&lt;br&gt;./configure&lt;br&gt;make &amp;amp;&amp;amp; make install&lt;br&gt;cd ../&lt;br&gt;wget &lt;a href="http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz"&gt;http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz&lt;/a&gt;&lt;br&gt;tar zxvf ngx_cache_purge-1.0.tar.gz&lt;br&gt;wget &lt;a href="http://nginx.org/download/nginx-0.8.32.tar.gz"&gt;http://nginx.org/download/nginx-0.8.32.tar.gz&lt;/a&gt;&lt;br&gt;tar zxvf nginx-0.8.32.tar.gz&lt;br&gt;cd nginx-0.8.32/&lt;br&gt;./configure --user=www --group=www --add-module=../ngx_cache_purge-1.0 --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module&lt;br&gt;make &amp;amp;&amp;amp; make install&lt;br&gt;cd ../ &lt;hr&gt; &lt;br&gt;　　2、/usr/local/webserver/nginx/conf/nginx.conf 配置文件内容如下： &lt;p&gt;user&amp;nbsp; www www;&lt;br&gt;worker_processes 8;&lt;br&gt;error_log&amp;nbsp; /usr/local/webserver/nginx/logs/nginx_error.log&amp;nbsp; crit;&lt;br&gt;pid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /usr/local/webserver/nginx/nginx.pid;&lt;br&gt;#Specifies the value for maximum file descriptors that can be opened by this process. &lt;br&gt;worker_rlimit_nofile 65535;&lt;br&gt;events &lt;br&gt;{&lt;br&gt;&amp;nbsp; use epoll;&lt;br&gt;&amp;nbsp; worker_connections 65535;&lt;br&gt;}&lt;br&gt;http &lt;br&gt;{&lt;br&gt;&amp;nbsp; include&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mime.types;&lt;br&gt;&amp;nbsp; default_type&amp;nbsp; application/octet-stream;&lt;br&gt;&amp;nbsp; charset&amp;nbsp; utf-8;&lt;br&gt;&amp;nbsp; server_names_hash_bucket_size 128;&lt;br&gt;&amp;nbsp; client_header_buffer_size 32k;&lt;br&gt;&amp;nbsp; large_client_header_buffers 4 32k;&lt;br&gt;&amp;nbsp; client_max_body_size 300m;&lt;br&gt;&amp;nbsp; sendfile on;&lt;br&gt;&amp;nbsp; tcp_nopush&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; on;&lt;br&gt;&amp;nbsp; keepalive_timeout 60;&lt;br&gt;&amp;nbsp; tcp_nodelay on;&lt;br&gt;&amp;nbsp; client_body_buffer_size&amp;nbsp; 512k;&lt;br&gt;&amp;nbsp; proxy_connect_timeout&amp;nbsp;&amp;nbsp;&amp;nbsp; 5;&lt;br&gt;&amp;nbsp; proxy_read_timeout&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 60;&lt;br&gt;&amp;nbsp; proxy_send_timeout&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5;&lt;br&gt;&amp;nbsp; proxy_buffer_size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 16k;&lt;br&gt;&amp;nbsp; proxy_buffers&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4 64k;&lt;br&gt;&amp;nbsp; proxy_busy_buffers_size 128k;&lt;br&gt;&amp;nbsp; proxy_temp_file_write_size 128k;&lt;br&gt;&amp;nbsp; gzip on;&lt;br&gt;&amp;nbsp; gzip_min_length&amp;nbsp; 1k;&lt;br&gt;&amp;nbsp; gzip_buffers&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4 16k;&lt;br&gt;&amp;nbsp; gzip_http_version 1.1;&lt;br&gt;&amp;nbsp; gzip_comp_level 2;&lt;br&gt;&amp;nbsp; gzip_types&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text/plain application/x-javascript text/css application/xml;&lt;br&gt;&amp;nbsp; gzip_vary on;&lt;br&gt;&amp;nbsp; #注：proxy_temp_path和proxy_cache_path指定的路径必须在同一分区&lt;br&gt;&amp;nbsp; proxy_temp_path&amp;nbsp;&amp;nbsp; /data0/proxy_temp_dir;&lt;br&gt;&amp;nbsp; #设置Web缓存区名称为cache_one，内存缓存空间大小为200MB，1天没有被访问的内容自动清除，硬盘缓存空间大小为30GB。&lt;br&gt;&amp;nbsp; proxy_cache_path&amp;nbsp; /data0/proxy_cache_dir&amp;nbsp; levels=1:2&amp;nbsp;&amp;nbsp; keys_zone=cache_one:200m inactive=1d max_size=30g;&lt;br&gt;&amp;nbsp; upstream backend_server {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; server&amp;nbsp;&amp;nbsp; 192.168.8.43:80 weight=1 max_fails=2 fail_timeout=30s;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; server&amp;nbsp;&amp;nbsp; 192.168.8.44:80 weight=1 max_fails=2 fail_timeout=30s;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; server&amp;nbsp;&amp;nbsp; 192.168.8.45:80 weight=1 max_fails=2 fail_timeout=30s;&lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp; server&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; listen&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 80;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; server_name&amp;nbsp; www.yourdomain.com 192.168.8.42;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; index index.html index.htm;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp; /data0/htdocs/www;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; location /&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #如果后端的服务器返回502、504、执行超时等错误，自动将请求转发到upstream负载均衡池中的另一台服务器，实现故障转移。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_next_upstream http_502 http_504 error timeout invalid_header;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_cache cache_one;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #对不同的HTTP状态码设置不同的缓存时间&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_cache_valid&amp;nbsp; 200 304 12h;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #以域名、URI、参数组合成Web缓存的Key值，Nginx根据Key值哈希，存储缓存内容到二级缓存目录内&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_cache_key $host$uri$is_args$args;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_set_header Host&amp;nbsp; $host;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_set_header X-Forwarded-For&amp;nbsp; $remote_addr;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_pass http://backend_server;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; expires&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1d;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #用于清除缓存，假设一个URL为http://192.168.8.42/test.txt，通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; location ~ /purge(/.*)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #设置只允许指定的IP或IP段才可以清除URL缓存。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allow&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 127.0.0.1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allow&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 192.168.0.0/16;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; deny&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; all;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_cache_purge&amp;nbsp;&amp;nbsp;&amp;nbsp; cache_one&amp;nbsp;&amp;nbsp; $host$1$is_args$args;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; location ~ .*\.(php|jsp|cgi)?$&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_set_header Host&amp;nbsp; $host;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_set_header X-Forwarded-For&amp;nbsp; $remote_addr;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy_pass http://backend_server;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; access_log&amp;nbsp; off;&lt;br&gt;&amp;nbsp; }&lt;br&gt;} &lt;hr&gt; &lt;br&gt;　　3、启动 Nginx： &lt;p&gt;/usr/local/webserver/nginx/sbin/nginx &lt;hr&gt; &lt;br&gt;　　4、清除指定的URL缓存示例：&lt;img src="http://www.cnblogs.com/leleroyn/aggbug/1922924.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leleroyn/archive/2010/12/31/1922924.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leleroyn/archive/2010/12/30/1922159.html</id><title type="text">Nginx：一个反向代理的设置</title><summary type="text">有这么一个情况， 有个运行Asp的应用，比较土，还是用本地 *.mdb 的数据库。这么一来，就不可能通过 Apache ::: asp 这样的插件令其运行在Linux的环境中。而且是相当烂的一个 asp 程序，连html模板都没单独目录存放，直接跟 *.asp 混在一块。 幸好这个世界有 Nginx， 是对待这种破东西最好的优化。 如果直接靠 IIS 既处理 asp 又处理静态文件的话，流量一大性...</summary><published>2010-12-30T07:25:00Z</published><updated>2010-12-30T07:25:00Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leleroyn/archive/2010/12/30/1922159.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/archive/2010/12/30/1922159.html"/><content type="html">&lt;p&gt;有这么一个情况， &lt;p&gt;有个运行Asp的应用，比较土，还是用本地 *.mdb 的数据库。这么一来，就不可能通过 Apache ::: asp 这样的插件令其运行在Linux的环境中。而且是相当烂的一个 asp 程序，连html模板都没单独目录存放，直接跟 *.asp 混在一块。 &lt;p&gt;幸好这个世界有 Nginx， 是对待这种破东西最好的优化。 &lt;p&gt;如果直接靠 IIS 既处理 asp 又处理静态文件的话，流量一大性能是不堪想象了。&lt;br&gt;(在ab压力测试中, 就100线程请求一个 gif 的静态文件做测试, 已经令IIS的CPU相当不安) &lt;p&gt;2台服务器，运行架构计划为最简单的 Nginx –&amp;gt; IIS &lt;p&gt;就通过 Nginx Proxy 到IIS 的80端口上。 &lt;p&gt;但测试的时候发现，虽然速度瞬间得到体现，但每次请求，Nginx 都会往IIS上拉文件，特别是静态文件。&lt;br&gt;大，而且会让IIS的cpu不安分。 &lt;p&gt;原本试用在 Linux 下 mount&amp;nbsp; 一个 smb 的盘，然后让Nginx直接往里头通过 smb 请求 IIS 应用服务器上的静态文件。从而绕开 IIS 避免压力。但出了怪问题….况且跟本文无关,就暂略不说了。 &lt;p&gt;最后用上了 Nginx proxy_store ，Nginx 直接把静态文件在本地硬盘创建并读取， &lt;p&gt;效果相当好，而且某程度上对待这么烂的应用要装个Squid 确实有点大题小作。 &lt;p&gt;但 Proxy_store 跟 Squid 是有区别的!! 最明显的一点在于其不具有expires，无法通过程序控制cache什么时间过期。往后要写个脚本定期删除缓存目录中的内容，不过这也正合我意。 &lt;p&gt;以下是配置方式： &lt;p&gt;如果需要将文件缓存到本地，则需要增加如下几个子参数：&lt;br&gt;proxy_store on;&lt;br&gt;proxy_store_access user:rw group:rw all:rw;&lt;br&gt;proxy_temp_path 缓存目录; &lt;p&gt;其中，&lt;br&gt;proxy_store on 启用缓存到本地的功能，&lt;br&gt;proxy_temp_path 指定缓存在哪个目录下，如：proxy_temp_path /var/nginx_cache; &lt;p&gt;在经过上一步配置之后，虽然文件被缓存到了本地磁盘上，但每次请求仍会向远端拉取文件，为了避免去远端拉取文件，还必须增加： &lt;p&gt;if ( !-e $request_filename) {&lt;br&gt;proxy_pass&amp;nbsp; &lt;a href="http://192.168.10.10/"&gt;http://192.168.10.10&lt;/a&gt;;&lt;br&gt;} &lt;p&gt;即改成有条件地去执行proxy_pass，这个条件就是当请求的文件在本地的proxy_temp_path指定的目录下不存在时，再向后端拉取。 &lt;p&gt;整体配置例子： &lt;p&gt;location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|html|htm|css)$ {&amp;nbsp; #指定缓存文件类型&lt;br&gt;expires 7d;&amp;nbsp; #设置浏览器过期时间&lt;br&gt;root /data1/nginx_cache/iis;&amp;nbsp; #静态文件根目录目录(必须对应proxy_temp_path)&lt;br&gt;proxy_store on;&amp;nbsp; #开启缓存机制&lt;br&gt;proxy_store_access user:rw group:rw all:rw;&amp;nbsp; #缓存读写规则&lt;br&gt;proxy_temp_path /data1/nginx_cache/iis;&amp;nbsp; #存放静态文件的缓存目录&lt;br&gt;include proxy.conf;&amp;nbsp; # 外联proxy理的详细配置如proxy_set_header， client_max_body_size ….&lt;br&gt;if ( !-e $request_filename) {&amp;nbsp; #正则表达式，匹配缓存目录中的文件与源文件是否存在)&lt;br&gt;proxy_pass&amp;nbsp; &lt;a href="http://192.168.10.10/"&gt;http://192.168.10.10&lt;/a&gt; # IIS 应用的服务器地址&lt;br&gt;}&lt;br&gt;} &lt;img src="http://www.cnblogs.com/leleroyn/aggbug/1922159.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leleroyn/archive/2010/12/30/1922159.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leleroyn/archive/2010/12/30/1921544.html</id><title type="text">【MVC整理】4.Asp.net MVC 如何防止CSRF攻击</title><summary type="text">什么是CSRF攻击？  CSRF（Cross-site request forgery跨站请求伪造，也被称成为“one click attack”或者session riding，通常缩写为CSRF或者XSRF，是一种对网站的恶意利用。尽管听起来像跨站脚本（XSS），但它与XSS非常不同，并且攻击方式几乎相左。XSS利用站点内的信任用户，而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。...</summary><published>2010-12-30T03:55:00Z</published><updated>2010-12-30T03:55:00Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leleroyn/archive/2010/12/30/1921544.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/archive/2010/12/30/1921544.html"/><content type="html">&lt;p&gt;什么是CSRF攻击？&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;CSRF（Cross-site request forgery跨站请求伪造，也被称成为“one click attack”或者session riding，通常缩写为CSRF或者XSRF，是一种对网站的恶意利用。尽管听起来像跨站脚本（XSS），但它与XSS非常不同，并且攻击方式几乎相左。XSS利用站点内的信任用户，而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比，CSRF攻击往往不大流行（因此对其进行防范的资源也相当稀少）和难以防范，所以被认为比XSS更具危险性。&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;详细说明：&lt;a title="http://baike.baidu.com/view/1609487.htm" href="http://baike.baidu.com/view/1609487.htm"&gt;http://baike.baidu.com/view/1609487.htm&lt;/a&gt;&lt;/p&gt; &lt;p&gt;CSRF攻击发生的场景：&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;CSRF攻击依赖下面的假定：  &lt;p&gt;攻击者了解受害者所在的站点  &lt;p&gt;攻击者的目标站点具有持久化授权cookie或者受害者具有当前会话cookie  &lt;p&gt;目标站点没有对用户在网站行为的第二授权 &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Asp.net MVC 内置了对CSRF进行防御的方法如下：&lt;/p&gt; &lt;p&gt;1.在View的Form表间中使用&lt;/p&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;&amp;lt;%=Html.AntiForgeryToken() %&amp;gt; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;例如：&lt;/p&gt;&lt;pre &gt;&amp;lt;% using (Html.BeginForm("Login", "Admin", FormMethod.Post))&#xD;
       { %&amp;gt;&#xD;
        &amp;lt;%=Html.AntiForgeryToken() %&amp;gt;&#xD;
        &amp;lt;%= Html.ValidationSummary(true, "登录不成功。请更正错误并重试。") %&amp;gt;&#xD;
    &amp;lt;div&amp;gt;&#xD;
        &amp;lt;fieldset&amp;gt;&#xD;
            &amp;lt;legend&amp;gt;帐户信息&amp;lt;/legend&amp;gt;            &#xD;
            &amp;lt;div &amp;gt;&#xD;
                &amp;lt;%= Html.LabelFor(m =&amp;gt; m.UserName) %&amp;gt;&#xD;
            &amp;lt;/div&amp;gt;&#xD;
            &amp;lt;div &amp;gt;&#xD;
                &amp;lt;%= Html.TextBoxFor(m =&amp;gt; m.UserName)%&amp;gt;&#xD;
                &amp;lt;%= Html.ValidationMessageFor(m =&amp;gt; m.UserName)%&amp;gt;&#xD;
                &amp;lt;label id="UserNameTip"&amp;gt;&amp;lt;/label&amp;gt;&#xD;
            &amp;lt;/div&amp;gt;&#xD;
            &amp;lt;div &amp;gt;&#xD;
                &amp;lt;%= Html.LabelFor(m =&amp;gt; m.Password) %&amp;gt;&#xD;
            &amp;lt;/div&amp;gt;&#xD;
            &amp;lt;div &amp;gt;&#xD;
                &amp;lt;%= Html.PasswordFor(m =&amp;gt; m.Password) %&amp;gt;&#xD;
                &amp;lt;%= Html.ValidationMessageFor(m =&amp;gt; m.Password) %&amp;gt;&#xD;
            &amp;lt;/div&amp;gt;&#xD;
            &amp;lt;p&amp;gt;&#xD;
                &amp;lt;input type="submit" value="登录" /&amp;gt;&#xD;
            &amp;lt;/p&amp;gt;&#xD;
        &amp;lt;/fieldset&amp;gt;&#xD;
    &amp;lt;/div&amp;gt;&#xD;
    &amp;lt;% } %&amp;gt;    &lt;/pre&gt;&#xD;
&lt;p&gt;2.d在对应的Action中用[ValidateAntiForgeryToken]进行标识：如下&lt;/p&gt;&lt;pre &gt;[HttpPost]&#xD;
        [ValidateAntiForgeryToken]&#xD;
        public ActionResult Login(Usr usr)&#xD;
        {&#xD;
            if (ModelState.IsValid)&#xD;
            {&#xD;
                var model = DB.Context.Single&amp;lt;Usr&amp;gt;(p =&amp;gt; p.SystemUser == true &amp;amp;&amp;amp; p.UserName == usr.UserName &amp;amp;&amp;amp; p.Password == usr.Password);&#xD;
                if (model != null)&#xD;
                {&#xD;
                    authenticate.Login(usr.UserName, usr.Role);&#xD;
                    return RedirectToAction("UserList", "Admin");&#xD;
                }&#xD;
                else&#xD;
                {&#xD;
                    ModelState.AddModelError("", "提供的用户名或密码不正确。");&#xD;
                }&#xD;
            }&#xD;
            return View(usr);&#xD;
        }&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其实我们发现Asp.net MVC 帮我们做了很多。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leleroyn/aggbug/1921544.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leleroyn/archive/2010/12/30/1921544.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leleroyn/archive/2010/12/28/1918776.html</id><title type="text">Subsonic： Code-First开发模式</title><summary type="text">一直以来都在使用数据驱动的开发模式：PD设计数据库模型，然后生成数据库脚本，再然后建立数据库（可能还要写段SQL脚本初始化一点数据），再然后用上个ORM框架，最后开始狂写代码。 实在太枯燥，太麻烦啦。 最近EF更新好像开始支持Code-First模式，看了几篇帖子觉得这才是我想要的开发模式：先写POCO类，然后自动生成数据库（如果是测试，可能这一步都可以暂时不做，然后开始写代码。简单的POCO类比...</summary><published>2010-12-28T04:08:00Z</published><updated>2010-12-28T04:08:00Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leleroyn/archive/2010/12/28/1918776.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/archive/2010/12/28/1918776.html"/><content type="html">&lt;p&gt;一直以来都在使用数据驱动的开发模式：PD设计数据库模型，然后生成数据库脚本，再然后建立数据库（可能还要写段SQL脚本初始化一点数据），再然后用上个ORM框架，最后开始狂写代码。&lt;/p&gt; &lt;p&gt;实在太枯燥，太麻烦啦。&lt;/p&gt; &lt;p&gt;最近EF更新好像开始支持Code-First模式，看了几篇帖子觉得这才是我想要的开发模式：先写POCO类，然后自动生成数据库（如果是测试，可能这一步都可以暂时不做，然后开始写代码。简单的POCO类比那些充血的实体实在是优雅了好多。别的优点那就更不用说啦，在mvc中直接拿做models层。我实在是太需要这些啦。&lt;/p&gt; &lt;p&gt;不过C在.net中code-First模式不是EF的专有。现在我将用我最喜爱的Subsonic来实现这个功能。Subsonic是一个轻量级的ORM方案，官网上也有很多教程。大家一起来学习下。&lt;/p&gt; &lt;p&gt;首先我胶需要下载Subsonic 3以上的版本，3以下的版本不支持code-first。另外Subsonic 3提供的LinqProvider可以让我们应用Linq进行数据库操作。&lt;/p&gt; &lt;p&gt;首先我们设计一个类：记得引入 Subsonic&lt;/p&gt;&lt;pre &gt;public class Usr&#xD;
    {&#xD;
        [SubSonicPrimaryKey]        &#xD;
        public int Id { get; set; }&#xD;
&#xD;
        [SubSonicStringLength(50)] &#xD;
        public string UserName { get; set; }&#xD;
&#xD;
        [SubSonicStringLength(50)]&#xD;
        [SubSonicNullString]       &#xD;
        public string Role { get; set; }&#xD;
       &#xD;
        public bool SystemUser { get; set; }&#xD;
&#xD;
        [SubSonicStringLength(50)]        &#xD;
        public string Password { get; set; }&#xD;
        &#xD;
        public DateTime Expire { get; set; }&#xD;
        &#xD;
        public bool Active { get; set; }        &#xD;
    }&lt;/pre&gt;&lt;pre &gt;注意类属性上的attribution ，它将指定我们在生成数据库时使用何种数据类型及长度等相关信息。&lt;/pre&gt;&lt;pre &gt;有了这个类，我们怎样让它生成数据库呢,太简单啦，看代码：记得引入 Subsonic&lt;/pre&gt;&lt;pre &gt;using System;&#xD;
using SubSonic.Repository;&#xD;
&#xD;
namespace BuildDBApplication&#xD;
{&#xD;
    class Program&#xD;
    {&#xD;
        static void Main(string[] args)&#xD;
        {&#xD;
            Console.WriteLine("正在为您生成数据库...");&#xD;
            _001_Init build = new _001_Init();&#xD;
            build.init();&#xD;
            Console.WriteLine("生成成功...");&#xD;
            Console.WriteLine("初始化数据...");&#xD;
            //查询和增加数据时可批定SimpleRepositoryOptions.None，意为不更改数据库结构。&lt;/pre&gt;&lt;pre &gt;var repo = new SimpleRepository("UCerterDB", SimpleRepositoryOptions.None);&#xD;
            UCenter.Entitys.Usr model = new UCenter.Entitys.Usr();&#xD;
            model.UserName = "Ants";&#xD;
            model.Password = "123456";&#xD;
            model.Active = true;&#xD;
            model.Expire =DateTime.Now;&#xD;
            model.SystemUser = true;&#xD;
            repo.Add(model);&#xD;
            Console.WriteLine("完成，请关闭窗口！");&#xD;
            Console.Read();&#xD;
        }&#xD;
    }&#xD;
    internal class _001_Init&#xD;
    {&#xD;
        public void init()&#xD;
        {&#xD;
            //一定要指定SimpleRepositoryOptions.RunMigrations，意为可以更改数据库结构&lt;/pre&gt;&lt;pre &gt;var repo = new SimpleRepository("UCerterDB", SimpleRepositoryOptions.RunMigrations);&#xD;
&#xD;
            //生成表，查询不到这个表时，它会自动生成表。很简单吧！&#xD;
            var Usr = repo.Single&amp;lt;UCenter.Entitys.Usr&amp;gt;(x =&amp;gt; x.Id == 0);&#xD;
           var ticket = repo.Single&amp;lt;UCenter.Entitys.Ticket&amp;gt;(x =&amp;gt; x.Id == 0);&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;code-first其实并不神秘。我相信很多人和我一样喜欢这种模式。更多介绍请请看官网。&#xD;
&lt;img src="http://www.cnblogs.com/leleroyn/aggbug/1918776.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leleroyn/archive/2010/12/28/1918776.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leleroyn/archive/2010/12/22/1913867.html</id><title type="text">【MVC整理】3. Asp.Net MVC 2 模型验证</title><summary type="text">原文链接：http://msdn.microsoft.com/zh-cn/downloads/ff393634.aspx ASP.NET MVC 2 验证 对用户输入的验证以及强制业务规则/逻辑是大多数web应用的核心需求。ASP.NET MVC 2包含了一堆新的特性，显著地简化了对用户输入的验证以及在模型/视图模型中对验证逻辑的强行实施。这些特性是这样设计的，验证逻辑总是在服务器上执行的，也可以...</summary><published>2010-12-22T06:49:00Z</published><updated>2010-12-22T06:49:00Z</updated><author><name>Ants</name><uri>http://www.cnblogs.com/leleroyn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leleroyn/archive/2010/12/22/1913867.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leleroyn/archive/2010/12/22/1913867.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;u&gt;原文链接：&lt;a title="http://msdn.microsoft.com/zh-cn/downloads/ff393634.aspx" href="http://msdn.microsoft.com/zh-cn/downloads/ff393634.aspx"&gt;http://msdn.microsoft.com/zh-cn/downloads/ff393634.aspx&lt;/a&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;ASP.NET MVC 2 验证&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;对用户输入的验证以及强制业务规则/逻辑是大多数web应用的核心需求。ASP.NET MVC 2包含了一堆新的特性，显著地简化了对用户输入的验证以及在模型/视图模型中对验证逻辑的强行实施。这些特性是这样设计的，验证逻辑&lt;em&gt;总是&lt;/em&gt;在服务器上执行的，也可以选择在客户端通过JavaScript来执行。ASP.NET MVC 2中的验证设施和特性这般设计，以便： &lt;p&gt;1) 开发人员可以轻易地利用内置于.NET框架中的DataAnnotation验证支持。DataAnnotation提供了一个非常简便的方式，使用最少的代码在对象和属性上用声明的方式添加验证规则。 &lt;p&gt;2) 开发人员可以集成他们自己的验证引擎，或者利用现有的验证框架，象Castle验证器或EntLib验证库。ASP.NET MVC 2的验证特性是设计来在利用新的 ASP.NET MVC 2的验证设施（包括客户端验证，模型绑定验证等等）的同时，简化任何类型的验证架构的插入的。 &lt;p&gt;这意味着，在常见的应用场景中启用验证是极其容易的，同时对更高级的场景则还能保持极好的灵活性。 &lt;p&gt;&lt;strong&gt;&lt;u&gt;使用ASP.NET MVC 2 和 DataAnnotation来启用验证&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;让我们在ASP.NET MVC 2中来全程示范一个简单的CRUD场景，利用新的内置DataAnnotation验证支持。具体来说，让我们来实现一个“Create”表单来允许用户输入朋友的数据： &lt;p&gt;&lt;img alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.1(zh-cn,MSDN.10).png" width="600" height="539"&gt; &lt;p&gt;我们想要确保在保存到数据库之前，输入的信息是合法的，如果不合法，就显示合适的错误消息： &lt;p&gt;&lt;img alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.2(zh-cn,MSDN.10).png" width="600" height="500"&gt; &lt;p&gt;我们想要使得这个验证同时在服务器端和客户端（通过 JavaScript）发生。我们还想要确保我们的代码遵守DRY原则（Don't Repeat Yourself,不重复自己），意味着我们应该只在一处实施验证规则，然后使得我们的控制器，action方法和视图来兑现这个承诺。 &lt;p&gt;在下面，我将使用VS 2010，用ASP.NET MVC 2来实现上面的场景。你也可以使用VS 2008及ASP.NET MVC 2来实现完全一样的场景。 &lt;p&gt;&lt;strong&gt;&lt;u&gt;第一步: 实现FriendsController (一开始没有验证)&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;我们首先在一个新的ASP.NET MVC 2项目中加一个简单的“Person”类，象下面这样： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.3(zh-cn,MSDN.10).png"&gt; &lt;p&gt;它有四个属性（是用C#的&lt;a href="http://blog.joycode.com/scottgu/archive/2007/03/11/95954.joy"&gt;自动属性&lt;/a&gt;支持实现的, 在VS 2010中VB也支持自动属性了，哎!）。 &lt;p&gt;然后在项目中加一个 “FriendsController” 控制器类，呈示2个 “Create” action方法。第一个action方法是在对&lt;em&gt;/Friends/Create&lt;/em&gt; URL的HTTP-GET请求进来时调用的，它会显示一个空白的表单，用来输入个人数据。第二个action方法是在对&lt;em&gt;/Friends/Create&lt;/em&gt; URL的HTTP-POST请求进来时调用的。它会将提交的表单输入映射到一个Person对象，核实没有绑定错误发生，如果是合法的，最终会将数据保存到数据库中去（在本教程的后面我们会实现相关的数据库工作）。如果提交的表单输入是不合法的，该action方法会重新显示带有错误的表单： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.4(zh-cn,MSDN.10).png"&gt; &lt;p&gt;在实现了控制器之后，可以在Visual Studio中在其中一个action方法中右击，选择 “添加视图”命令， 这会调出 “添加视图” 对话框。选择自动生成传入对象为Person的“Create”视图： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.5(zh-cn,MSDN.10).png"&gt; &lt;p&gt;然后Visual Studio会在我们项目的\Views\Friends\目录中，生成一个含有框架代码(scaffolded)的Create.aspx视图文件。注意下面，它利用了ASP.NET MVC 2中&lt;a href="http://blog.joycode.com/scottgu/archive/2010/01/17/115854.joy"&gt;新的强类型HTML辅助方法&lt;/a&gt;（促成了更好的intellisense和编译时检查支持）： &lt;p&gt;&lt;img alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.6(zh-cn,MSDN.10).png" width="600" height="686"&gt; &lt;p&gt;现在，当我们运行该应用，访问 &lt;em&gt;/Friends/Create&lt;/em&gt; URL时，我们将得到一张可以输入数据的空白表单： &lt;p&gt;&lt;img alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.7(zh-cn,MSDN.10).png" width="600" height="500"&gt; &lt;p&gt;但，因为我们还没有在应用中实现任何验证，谁也无法阻止我们在表单中键入假的输入，将其提交到服务器去。 &lt;p&gt;&lt;strong&gt;&lt;u&gt;第二步: 使用DataAnnotation来启用验证&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;现在，让我们来更新应用，执行一些基本的输入验证规则。我们将在我们的Person模型对象上实现这些规则，而&lt;em&gt;不是&lt;/em&gt;在控制器或视图中实现。在Person对象上实现这些规则的好处是，这将确保这些验证在应用中任何使用Person对象的场景中都会被执行（例如，如果后来添加了编辑场景的话）。这将帮助确保我们将代码保持DRY，避免在多处重复这些规则。 &lt;p&gt;ASP.NET MVC 2 允许开发人员轻松地在模型或视图模型类上添加声明式验证特性，然后ASP.NET MVC在应用中实施模型绑定操作时，这些验证规则就会被自动执行。为看其例子，让我们更新Person类，在其中加几个验证特性。这么做，在文件的顶部加一个对“System.ComponentModel.DataAnnotations”命名空间的 “using” 语句，然后在Person的属性上饰于[Required], [StringLength], [Range], 和 [RegularExpression] 验证特性（这几个特性都是在那个命名空间中实现的）： &lt;p&gt;&lt;img alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.8(zh-cn,MSDN.10).png" width="700" height="276"&gt; &lt;p&gt;&lt;em&gt;注： 在上面我们明式指定了错误信息字符串，你也可以在资源文件中定义它们，或者按进来的用户的语言/文化做本地化，你可以在&lt;/em&gt;&lt;a href="http://haacked.com/archive/2009/12/12/localizing-aspnetmvc-validation.aspx"&gt;&lt;em&gt;这里&lt;/em&gt;&lt;/a&gt;&lt;em&gt;了解如何本地化验证错误消息。&lt;/em&gt; &lt;p&gt;既然我们加了验证特性到Person类上，让我们来重新运行我们的应用，看在键入假的数值，将其提交回服务器时会发生什么： &lt;p&gt;&lt;img alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.9(zh-cn,MSDN.10).png" width="600" height="535"&gt; &lt;p&gt;注意上面我们的应用现在有一个蛮好的出错体验了。带不合法输入的文本元素以红色高亮显示，我们指定的验证错误消息也显示给了用户。表单还保留用户原先输入的数据，这样他们不用重新填写什么。但，你也许会问，怎么会是这样？ &lt;p&gt;要理解这个行为，让我们看一下处理我们表单的POST场景的Create action方法： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.10(zh-cn,MSDN.10).png"&gt; &lt;p&gt;在我们的HTML表单被提交回服务器时，上面的方法就会被调用。因为该action方法接受一个“Person” 对象为参数，ASP.NET MVC会创建一个Person对象，自动地将进来的表单输入数值映射到该对象上。作为该过程的一部分，ASP.NET MVC还会检查该Person对象上的DataAnnotation验证特性是否合法。如果一切都合法，那么我们代码中的ModelState.IsValid检查就会返回真值，在这种情形下，我们（最终）将把该Person对象保存到数据库中，然后重新定向回到主页上去。 &lt;p&gt;但如果Person对象上有任何验证错误的话，我们的action方法就会以该不合法Person对象的数据重新显示表单，这是通过上面代码片段中最后一行代码实现的。 &lt;p&gt;然后，错误消息就会显示在我们的视图中，因为我们的Create表单在每一个&amp;lt;%= Html.TextBoxFor() %&amp;gt;辅助方法的调用旁边都有一个&amp;lt;%= Html.ValidationMessageFor() %&amp;gt;辅助方法调用。Html.ValidationMessageFor() 辅助方法会针对传入视图的任何不合法的模型属性输出合适的错误消息： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.11(zh-cn,MSDN.10).png"&gt; &lt;p&gt;这个模式/方式有一个好处，就是非常容易配置，它还允许我们轻松地添加或改变我们Person类上的验证规则，&lt;u&gt;而不必改变控制器或视图中的任何代码&lt;/u&gt;。这个在一个地方指定验证规则，然后在所有的地方都会被承诺和遵守的能力，允许我们以最少的努力快速地发展我们的应用和规则，并且将代码保持在非常DRY的程度。 &lt;p&gt;&lt;strong&gt;&lt;u&gt;第三步: 启用客户端验证&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;目前我们的应用只能做服务器端的验证，这意味着我们的终端用户需要将表单提交到服务器才能看到任何验证错误消息。 &lt;p&gt;ASP.NET MVC 2的验证架构中一样非常酷的东西是，它同时支持服务器端 &lt;em&gt;和&lt;/em&gt; 客户端验证。为启用这个功能，我们要做的就是在视图中添加2个 JavaScript引用，编写一行代码： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.12(zh-cn,MSDN.10).png"&gt; &lt;p&gt;在我们添加了这三行后，ASP.NET MVC 2 就会使用我们加到Person类上的验证元数据，为我们连接好客户端JavaScript验证逻辑。这意味着，当用户使用tab键跳出一个不合法的输入元素时，就会得到瞬时的验证错误。 &lt;p&gt;要在我们的朋友应用中看客户端JavaScript支持的实战例子的话，让我们重新运行应用，在前三个文本框中填入合法的数值，然后尝试点击“Create（创建）”。注意，我们不必访问服务器就会得到遗漏值的瞬时错误消息： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.13(zh-cn,MSDN.10).png"&gt; &lt;p&gt;如果我们输入一些不是合法的email的字符话，错误消息就会瞬时从“Email Required （Email是个必需值）” 变为 “Not a valid email （email不合法）”（这是我们将规则加到Person类上时指定的错误消息）： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.14(zh-cn,MSDN.10).png"&gt; &lt;p&gt;在输入一个合法的email时，错误消息就是瞬时消失，文本框背景色也会恢复到正常的状态： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.15(zh-cn,MSDN.10).png"&gt; &lt;p&gt;好事是，我们不必编写自己的任何定制JavaScript就能启用上面的验证逻辑。我们的验证代码还是那么DRY，我们可以在一个地方指定规则，然后在整个应用中得到执行，同时在客户端和服务器端。 &lt;p&gt;注意，为安全的原因，服务器端验证规则总是执行的，即时你启用了客户端支持。这避免黑客尝试绕过客户端规则，哄骗攻击（spoof）你的服务器。 &lt;p&gt;ASP.NET MVC 2中的客户端JavaScript验证支持可与你在ASP.NET MVC应用中使用的任何验证框架/引擎协作，它并不要求你使用 DataAnnotation 验证方式，所有的基础设施是独立于 DataAnnotation的，可以与Castle验证器, EntLib验证应用块，或你选择使用的任何定制验证方案协作使用。 &lt;p&gt;如果你不想使用我们的客户端JavaScript文件，你也可以将其替换成jQuery验证插件，而使用那个库。 ASP.NET MVC Futures下载还包括针对ASP.NET MVC 2服务器端验证框架启用jQuery验证的支持。 &lt;p&gt;&lt;strong&gt;&lt;u&gt;第四步: 创建自定义的[Email]验证特性&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;.NET框架中的System.ComponentModel.DataAnnotations命名空间包括了众多可为你所用的内置验证特性。我们在上面的例子中使用了其中的四个：[Required], [StringLength], [Range], 和 [RegularExpression]。 &lt;p&gt;你也可以定义自己的定制验证特性，然后应用它们。你可以通过继承自System.ComponentModel.DataAnnotations命名空间中的ValidationAttribute基类，定义完全定制的特性。或者，你也可以选择继承自任何现有的验证特性，如果你只想要扩展它们的基本功能的话。 &lt;p&gt;例如，为帮助清理我们Person类中的代码，我们也许想要创建一个新的[Email]验证特性，将检查合法email的正则表达式封装起来。要这么做的话，我们只要象这样继承自RegularExpressionAttribute基类，然后用合适的email正则表达式调用RegularExpressionAttribute基类的构造器： &lt;p&gt;&lt;img alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.16(zh-cn,MSDN.10).png" width="598" height="131"&gt; &lt;p&gt;然后将Person类更新成使用我们新的[Email]验证属性，换掉我们先前使用的正则表达式，这使得我们的代码更干净，封装也更好： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.17(zh-cn,MSDN.10).png"&gt; &lt;p&gt;在创建定制的验证特性时，你还可以指定在服务器端以及在客户端通过JavaScript执行的验证逻辑。 &lt;p&gt;除了创建可施用于对象上个别属性的验证特性外，你还可以将验证特性施用于类的层次，这允许你对一个对象中的多个属性实施验证逻辑。要看实战例子的话，你可以参阅包含在默认ASP.NET MVC 2应用项目模板中AccountModels.cs/vb文件中的“PropertiesMustMatchAttribute” 定制特性（在VS 2010中做 文件-&amp;gt;新ASP.NET MVC 2 Web项目，然后查询该类）。 &lt;p&gt;&lt;strong&gt;&lt;u&gt;第五步: 持久化到数据库中&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;现在让我们来实现将朋友数据保存到数据库所需的逻辑。 &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.18(zh-cn,MSDN.10).png"&gt; &lt;p&gt;至此，我们只用了平白的（plain-old）C#类（有时称为“POCO” 类， 即 “plain old CLR (or C#) object”）。我们可以使用的一个方案是，编写一些单独的持久代码，将这我们已经编写好的现有类映射到数据库去。目前象NHibernate这样的对象关系映射（Object relational mapping - ORM）方案非常地好支持这样的POCO/PI风格的映射。随.NET 4发布的ADO.NET实体框架（Entity Framework - EF)也支持POCO / PI映射，而且就象NHibernate，EF也能启用以“只用代码（code only）”的方式（没有映射文件，也不需要设计器）定义持久性映射的能力。 &lt;p&gt;如果我们的Person对象以这种方式映射到数据库的话，我们不用对Person类做任何改动，也不用改动任何验证规则，它还会继续完好地工作。 &lt;p&gt;&lt;strong&gt;&lt;u&gt;但假如我们要使用图形工具来做ORM映射的话，怎么办？&lt;/u&gt;&lt;/strong&gt; &lt;p&gt;今天使用Visual Studio的许多开发人员并不编写他们自己的ORM映射/持久逻辑，而是使用Visual Studio中内置的设计器来帮助管理这样的映射逻辑。 &lt;p&gt;使用DataAnnotation（或者任何其他形式的基于特性的验证）时一个经常问起的问题是，“如果你手头的模型对象是由GUI设计器创建/维护的话，你该如何施用这些特性？”。例如，假如与类似我们至此为止一直在使用的POCO风格的Person类不同，我们而是在Visual Studio中通过象LINQ to SQL 或 ADO.NET EF设计器这样的GUI映射工具定义/维护我们的Person类的话，该怎么办呢： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.19(zh-cn,MSDN.10).png"&gt; &lt;p&gt;上面是一张屏幕截图，展示了在VS 2010中使用ADO.NET EF设计器定义的一个Person类。上方的窗口定义了Person类，下方的窗口展示了该类的属性是如何映射到数据库中的“People”表的映射编辑器。当你在设计器上点击保存时，它会自动为你在项目中生成一个Person类。这很棒，但每次你做了改动，点击保存时，它就会&lt;em&gt;重新生成 Person 类&lt;/em&gt;，这会导致你在对象上面声明的任何验证特性的丢失。 &lt;p&gt;将额外的基于特性的元数据（象验证特性）施加到由VS设计器自动生成/维护的类的一个方法是，采用一个我们称之为“伙伴类（buddy classes）”的技术。基本上来说，你创建另外一个类，包含你的验证特性和元数据，然后通过将 “MetadataType”特性施加到一个与工具生成的类一起编译的partial类上，将其与由设计器生成的类连接起来。例如，如果我们想要将我们前面用到的验证规则施加到由LINQ to SQL 或 ADO.NET EF设计器维护的Person类上，我们可以更新我们的验证代码，使其存在于一个单独的“Person_Validation”类上，使用象下面这样的代码将其连接到由VS创建的“Person”类上： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.20(zh-cn,MSDN.10).png"&gt; &lt;p&gt;上面的做法没有纯粹的POCO方法那么优雅，但其好处是，可以用于Visual Studio中任何工具或设计器生成的代码。 &lt;p&gt;&lt;strong&gt;&lt;u&gt;最后一步 – 将Friend保存到数据库中&lt;/u&gt;&lt;/strong&gt; &lt;p&gt;最后一步，不管是否采用了POCO或工具生成的Person类，是将合法的朋友数据保存到数据库中去。 &lt;p&gt;这只要求我们用三行代码将FriendsControlle类中的 “Todo”占位语句替换掉，这三行代码将新朋友保存到数据库。下面是整个FriendsController类的完整代码（使用了ADO.NET EF做数据库持久化）： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.21(zh-cn,MSDN.10).png"&gt; &lt;p&gt;现在，当我们访问 &lt;em&gt;/Friends/Create&lt;/em&gt; URL时，我们可以轻松地添加新人到我们的朋友数据库中去： &lt;p&gt;&lt;img title="" alt="" align="top" src="http://i.msdn.microsoft.com/ff393634.22(zh-cn,MSDN.10).png"&gt; &lt;p&gt;对所有数据的验证都是同时在客户端和服务器端执行的。我们可以轻易地在一个地方添加/修改/删除验证规则，而由整个应用中的所有的控制器和视图来执行这些规则。 &lt;p&gt;&lt;strong&gt;&lt;u&gt;结语&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;ASP.NET MVC 2极大地简化了web应用的验证集成。它倡议一种基于模型的验证方式，允许你将你的应用保持DRY，帮助确保验证规则在整个应用中保持一致。ASP.NET MVC 2中内置的DataAnnotation支持，原本就使得对常见的验证场景的支持非常容易。而且，ASP.NET MVC 2验证设施中的扩展性支持允许你支持更大范围的更高级的验证场景，可以插入任何现有的或者定制的验证框架/引擎。 &lt;img src="http://www.cnblogs.com/leleroyn/aggbug/1913867.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leleroyn/archive/2010/12/22/1913867.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
