<feed 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/" xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
    <title>开源ASP.NET/C#论坛系统</title>
    <link rel="self" type="application/atom+xml" href="http://blog.entlib.com/entlibforum/Atom.aspx" />
    <subtitle type="html">Welcome to open-source forum!</subtitle>
    <id>http://blog.entlib.com/entlibforum/Default.aspx</id>
    <author>
        <name>entlibforum</name>
        <uri>http://blog.entlib.com/entlibforum/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="EntLib.com Blog Version 3.0.0.0">Subtext</generator>
    <updated>2009-12-30T18:35:48Z</updated>
    <entry>
        <title>EntLib.com 电子商务系统 - 后台业务处理系统（BES）- 用户操作手册（PDF文档下载） </title>
        <link rel="alternate" type="text/html" href="http://blog.entlib.com/entlibforum/archive/2009/12/30/entlib.com-bes-pdf.aspx" />
        <id>http://blog.entlib.com/entlibforum/archive/2009/12/30/entlib.com-bes-pdf.aspx</id>
        <published>2009-12-30T18:35:02Z</published>
        <updated>2009-12-30T18:35:48Z</updated>
        <content type="html">&lt;div style="text-align: center"&gt;&lt;strong&gt;&lt;span id="forum__ctl0_TopicTitle"&gt;EntLib.com 电子商务系统 - 后台业务处理系统（BES）- 用户操作手册（PDF文档下载）&lt;/span&gt; &lt;/strong&gt;&lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" src="http://forum.entlib.com/useruploadfiles/entlibboy/image/eCommerce_BES/entlib_bes_usermanual_pdf.gif" /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;strong&gt;PDF 阅读器官方下载地址：&lt;/strong&gt;&lt;br /&gt;
&lt;a href="http://get.adobe.com/cn/reader/"&gt;http://get.adobe.com/cn/reader/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
如果您的电脑上没有安装 PDF 阅读器，可以到上述的adobe 官方网站上下载PDF 阅读器，然后在本地电脑上安装。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;后台业务系统-用户操作手册-下载地址：&lt;br /&gt;
&lt;/strong&gt;&lt;a href="http://forum.entlib.com/Default.aspx?g=posts&amp;amp;t=813"&gt;http://forum.entlib.com/Default.aspx?g=posts&amp;amp;t=813&lt;/a&gt;&lt;br /&gt;&lt;img src="http://blog.entlib.com/entlibforum/aggbug/229.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.entlib.com/entlibforum/comments/229.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.entlib.com/entlibforum/comments/commentRss/229.aspx</wfw:commentRss>
        <trackback:ping>http://blog.entlib.com/entlibforum/services/trackbacks/229.aspx</trackback:ping>
    </entry>
    <entry>
        <title>电子商务网站的快速SEO解决方案 （葵花宝典 - PDF 文档下载）</title>
        <link rel="alternate" type="text/html" href="http://blog.entlib.com/entlibforum/archive/2009/10/26/seo-pdf.aspx" />
        <id>http://blog.entlib.com/entlibforum/archive/2009/10/26/seo-pdf.aspx</id>
        <published>2009-10-26T12:13:09Z</published>
        <updated>2009-10-26T12:18:23Z</updated>
        <content type="html">&lt;div style="text-align: center"&gt;&lt;strong&gt;电子商务网站的快速SEO解决方案 （葵花宝典 - PDF 文档下载）&lt;br /&gt;
&lt;/strong&gt;&lt;/div&gt;
&lt;div style="margin: 12pt 0cm 3pt"&gt; &lt;/div&gt;
&lt;div&gt;本文是EntLib.com 电子商务小组（&lt;a href="http://www.entlib.com/"&gt;http://www.EntLib.com&lt;/a&gt; ）针对国内电子商务网站关于SEO的一些思考和建议，提供了一些常用的、简单可行的SEO行动方案。更 高级别的、有针对性的优化方案需要深入分析和探讨。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;通过阅读本文，你可以实现如下目的：&lt;/div&gt;
&lt;ol type="1" style="margin-top: 0cm"&gt;
    &lt;li&gt;了解电子商务网站的一些基本SEO规范。&lt;/li&gt;
    &lt;li&gt;了解一些免费的网站管理员工具。&lt;/li&gt;
    &lt;li&gt;本文提供的SEO改进方案简单实用，实现成本很小，但长期效果明显，对网站业务非常有帮助。&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="margin: 0cm 0cm 0pt 18pt"&gt; &lt;/div&gt;
&lt;div&gt;本文的大部分建议都基于SEO基本知识和我们的电子商务实践， 同时也参考业内的SEO专家文章和搜索引擎公司的官方文档。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本文的一些场景以礼品中心网（&lt;a href="http://www.giftcenter.cn/"&gt;http://www.GiftCenter.cn&lt;/a&gt; ）的内容为主进行分析，在此表示感谢。这些SEO技术都已经在EntLib.com eCommerce 电子商务系统中予以实现，因此在技术上和实现上都没有问题。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本文，对希望提高网站与用户和搜索引擎交互性的网站管理员们也一样会有帮助，所以我们对SEO相关内容进行整理完善，发表出来供大家参考。&lt;/div&gt;
&lt;br /&gt;
&lt;strong&gt;这里提供《电子商务网站的快速SEO解决方案》完整的PDF 文档下载！&lt;/strong&gt;&lt;br /&gt;
&lt;div style="text-align: center"&gt;&lt;br /&gt;
&lt;input src="http://forum.entlib.com/useruploadfiles/%E7%BE%8E%E5%A5%B3%E7%A8%8B%E5%BA%8F%E5%91%98/image/seo/seo_quicksolutionforecommerce_1.gif" width="667" height="535" type="image" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: left"&gt;该PDF 文档共有 21 页，下面是《电子商务网站的快速SEO解决方案》的目录。&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;欢迎下载！如有建议或反馈，欢迎回复！谢谢！&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center"&gt;&lt;input src="http://forum.entlib.com/useruploadfiles/%E7%BE%8E%E5%A5%B3%E7%A8%8B%E5%BA%8F%E5%91%98/image/seo/seo_quicksolutionforecommerce_2.gif" width="673" height="726" type="image" /&gt;&lt;/div&gt;
&lt;div style="text-align: left"&gt;&lt;strong&gt;下载地址：&lt;br /&gt;
&lt;/strong&gt;&lt;a class="post_link" href="http://forum.entlib.com/Default.aspx?g=posts&amp;amp;t=644"&gt;电子商务网站的快速SEO解决方案 （葵花宝典 - PDF 文档下载） --- EntLib.com 电子商务小组倾力制作&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;/div&gt;&lt;img src="http://blog.entlib.com/entlibforum/aggbug/225.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.entlib.com/entlibforum/comments/225.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.entlib.com/entlibforum/comments/commentRss/225.aspx</wfw:commentRss>
        <trackback:ping>http://blog.entlib.com/entlibforum/services/trackbacks/225.aspx</trackback:ping>
    </entry>
    <entry>
        <title>最新版 Enterprise Library 企业库 V4.1 中文学习手册 （提供整合的PDF文档下载）</title>
        <link rel="alternate" type="text/html" href="http://blog.entlib.com/entlibforum/archive/2009/10/20/enterprise-library-v4.1-pdf.aspx" />
        <id>http://blog.entlib.com/entlibforum/archive/2009/10/20/enterprise-library-v4.1-pdf.aspx</id>
        <published>2009-10-20T13:50:08Z</published>
        <updated>2009-10-20T13:52:57Z</updated>
        <content type="html">&lt;div align="center"&gt;&lt;b&gt;最新版 Enterprise Library &lt;/b&gt;&lt;b&gt;企业库 V4.1 &lt;/b&gt;&lt;b&gt;中文学习手册 &lt;/b&gt;&lt;b&gt;（提供整合的PDF&lt;/b&gt;&lt;b&gt;文档下载）&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns &amp;amp; practices 小组为.NET Framework 3.5 开发一套企业库，目前最新版本为v4.1，共包括9个Application Block，包括数据访问（Data Access Application Block）、异常管理（Exception Handling Application Block）、数据验证（Validation Application Block）、日志管理、依赖注入容器Unity、缓存管理、加密/解密、安全管理等等，对企业应用开发非常有帮助，也非常实用。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;a href="http://forum.entlib.com/Default.aspx?g=posts&amp;amp;t=576"&gt;&lt;img width="592" height="91" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/EnterpriseLibraryTopic.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://forum.entlib.com/"&gt;http://forum.EntLib.com&lt;/a&gt; 开源论坛小组根据EntLib Hands-On Labs提供了全套的中文学习手册，同时也提供了整合的PDF 文档下载 ---&lt;strong&gt; 共有133页&lt;/strong&gt;。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="690" height="487" src="/userfiles/entlibforum/image/EnterpriseLibrary/EnterpriseLibrary_hands_on_pdf.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;文档及下载地址：&lt;/div&gt;
&lt;div&gt;&lt;a href="http://forum.entlib.com/Default.aspx?g=posts&amp;amp;t=576"&gt;http://forum.entlib.com/Default.aspx?g=posts&amp;amp;t=576&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/entlibforum/aggbug/224.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.entlib.com/entlibforum/comments/224.aspx</wfw:comment>
        <slash:comments>4</slash:comments>
        <wfw:commentRss>http://blog.entlib.com/entlibforum/comments/commentRss/224.aspx</wfw:commentRss>
        <trackback:ping>http://blog.entlib.com/entlibforum/services/trackbacks/224.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Enterprise Library - Security Application Block 学习手册（最新版） Part 2</title>
        <link rel="alternate" type="text/html" href="http://blog.entlib.com/entlibforum/archive/2009/10/12/enterprise-library-security-application-block-part-2.aspx" />
        <id>http://blog.entlib.com/entlibforum/archive/2009/10/12/enterprise-library-security-application-block-part-2.aspx</id>
        <published>2009-10-12T19:53:24Z</published>
        <updated>2009-10-12T19:53:24Z</updated>
        <summary type="html">本系列文章引导学习Enterprise Library - Security Application Block，并实践如何在不同的应用程序环境中使用Security Application Block的功能。前一节中，使用基于角色的授权来保护应用程序，这一节将练习使用AuthorizationProvider来保护应用程序。&lt;br /&gt;
...&lt;br /&gt;
选择Security Application Block | Authorization 节点，添加一个新的Authorization Rule Provider。
&lt;div style="text-align: center"&gt;&lt;img width="582" height="279" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Security/Security_2_2.gif" /&gt;&lt;/div&gt;</summary>
        <content type="html">&lt;div align="center"&gt;&lt;b&gt;Enterprise Library - Security Application Block &lt;/b&gt;&lt;b&gt;学习手册（最新版） Part 2&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本系列文章引导学习Enterprise Library - Security Application Block，并实践如何在不同的应用程序环境中使用Security Application Block的功能。前一节中，使用基于角色的授权来保护应用程序，这一节将练习使用AuthorizationProvider来保护应用程序。本文由&lt;a href="http://blog.entlib.com/"&gt;http://blog.entlib.com&lt;/a&gt; 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供，欢迎交流。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;使用AuthorizationProvider实现如下功能：&lt;/div&gt;
&lt;div&gt;（1）映射基于任务的授权为复杂的角色组合；&lt;/div&gt;
&lt;div&gt;（2）从应用程序代码中提取授权；&lt;/div&gt;
&lt;div&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;练习二：在应用程序中使用基于规则的授权（Rule-Based Authorization&lt;/b&gt;&lt;b&gt;） &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;首先打开ex02\begin 目录下的BugSmak.sln 项目文件。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;使用Enterprise Library&lt;/b&gt;&lt;b&gt;配置管理工具&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 使用Enterprise Library配置工具打开app.config配置文件，添加新的Security Application Block配置项。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="632" height="318" src="/userfiles/entlibforum/image/EnterpriseLibrary/Security/Security_2_1.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 选择Security Application Block | Authorization 节点，添加一个新的Authorization Rule Provider。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="582" height="279" src="/userfiles/entlibforum/image/EnterpriseLibrary/Security/Security_2_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;设置Name =BugSmak Rules。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 选择 Security Application Block | Authorization | BugSmak Rules 节点，通过New | Rule菜单项添加新的Rule。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="591" height="311" src="/userfiles/entlibforum/image/EnterpriseLibrary/Security/Security_2_3.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;4. 选择Security Application Block | Authorization | BugSmak Rules | Rule 节点，点击Expression属性后的… 按钮，弹出Rule Expression Editor对话框。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="632" height="274" src="/userfiles/entlibforum/image/EnterpriseLibrary/Security/Security_2_4.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;在Rule Expression Editor对话框中，设置如下属性：&lt;/div&gt;
&lt;div&gt;Rule Name = Raise Bug&lt;/div&gt;
&lt;div&gt;Expression = R:Developer OR R:Employee OR R:Manager&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="587" height="558" src="/userfiles/entlibforum/image/EnterpriseLibrary/Security/Security_2_5.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;用户必须是Developer、Employee、或Manager角色。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;5. 按照上述步骤，添加新的Rule和表达式。&lt;/div&gt;
&lt;div&gt;规则名称：Assign Bug&lt;span&gt;   --- &lt;/span&gt;表达式Expression：R:Manager&lt;/div&gt;
&lt;div&gt;规则名称：Resolve Bug&lt;span&gt;   --- &lt;/span&gt;表达式Expression：R:Developer OR R:Manager&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;设置完成后，界面如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="587" height="281" src="/userfiles/entlibforum/image/EnterpriseLibrary/Security/Security_2_6.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;6. 选择Security Application Block节点，设置如下属性。&lt;/div&gt;
&lt;div&gt;DefaultAuthorizationInstance = BugSmak Rules&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;最后保存好app.config配置文件。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;为应用程序添加基于任务的授权&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 打开TaskForms \ RaiseBug.cs代码文件，其中关于PrincipalPermissions部分的硬编码已经注释掉了，这里将采用更加灵活的任务授权。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: green"&gt;//[PrincipalPermission(SecurityAction.Demand, Role = "Employee")]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: green"&gt;//[PrincipalPermission(SecurityAction.Demand, Role = "Developer")]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: green"&gt;//[PrincipalPermission(SecurityAction.Demand, Role = "Manager")]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;RaiseBug&lt;/span&gt; Create()&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// TODO: Check Authorization&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;b&gt;!&lt;span style="color: #2b91af"&gt;SecurityHelper&lt;/span&gt;.Authorized(&lt;span style="color: #2b91af"&gt;AuthRule&lt;/span&gt;.Raise)&lt;/b&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SecurityException&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;RaiseBug&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;AssignBug.cs 和 ResolveBug.cs 有上述相似的代码。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 为项目文件添加对Security Application Block程序集的引用。&lt;/div&gt;
&lt;div&gt;Microsoft.Practices.EnterpriseLibrary.Security.dll&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 打开Security \ SecurityHelper.cs代码文件，添加如下命名空间的引用。&lt;/div&gt;
&lt;div&gt;using Microsoft.Practices.EnterpriseLibrary.Security;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;4. 添加如下代码到Authorized方法。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; Authorized(&lt;span style="color: blue"&gt;string&lt;/span&gt; rule)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;bool&lt;/span&gt; authorized = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// TODO: Check rule-base authorization&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;IAuthorizationProvider&lt;/span&gt; ruleProvider;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;            ruleProvider = &lt;span style="color: #2b91af"&gt;AuthorizationFactory&lt;/span&gt;.GetAuthorizationProvider();&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;            authorized = ruleProvider.Authorize(&lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.CurrentPrincipal, rule);&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;return&lt;/span&gt; authorized;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;上述代码使用AuthorizationFactory 检索默认的authorization provider，授权提供者将依据规则，测试当前的principal（ role和identity）是否授权。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;5. 运行应用程序，分别以不同的用户Tom / Dick / Harry登录，验证不同的用户是否分配了不同的权限。&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.entlib.com/"&gt;http://www.entlib.com&lt;/a&gt;专业ASP.NET电子商务平台小组，欢迎你继续访问Security  Application Block学习手册。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;参考文档：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;Security Application Block Hands-On Labs for Enterprise Library&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/entlibforum/aggbug/223.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.entlib.com/entlibforum/comments/223.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.entlib.com/entlibforum/comments/commentRss/223.aspx</wfw:commentRss>
        <trackback:ping>http://blog.entlib.com/entlibforum/services/trackbacks/223.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Enterprise Library - Security Application Block 学习手册（最新版） Part 1</title>
        <link rel="alternate" type="text/html" href="http://blog.entlib.com/entlibforum/archive/2009/10/12/enterprise-library-security-application-block-part-1.aspx" />
        <id>http://blog.entlib.com/entlibforum/archive/2009/10/12/enterprise-library-security-application-block-part-1.aspx</id>
        <published>2009-10-12T19:38:44Z</published>
        <updated>2009-10-12T19:43:27Z</updated>
        <summary type="html">本系列文章引导学习Enterprise Library - Security Application Block，并实践如何在不同的应用程序环境中使用Security Application Block的功能。&lt;br /&gt;
...&lt;br /&gt;
ASP.NET 提供了2个membership provider：一个是使用Microsoft SQL Server作为数据源，另一个则使用Windows Active Directory。&lt;br /&gt;
也可以创建定制的membership provider，范例程序将从XML文件中读取应用程序的成员信息。&lt;br/&gt;
...&lt;br /&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="368" height="234" src="/userfiles/entlibforum/image/EnterpriseLibrary/Security/Security_1_1.gif" /&gt;&lt;/div&gt;</summary>
        <content type="html">&lt;div align="center"&gt;&lt;b&gt;Enterprise Library - Security Application Block &lt;/b&gt;&lt;b&gt;学习手册（最新版） Part 1&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本系列文章引导学习Enterprise Library - Security Application Block，并实践如何在不同的应用程序环境中使用Security Application Block的功能。本文由&lt;a href="http://blog.entlib.com/"&gt;http://blog.entlib.com&lt;/a&gt; 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供，欢迎交流。&lt;/div&gt;
&lt;div&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;练习一：保护应用程序 &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;首先打开ex01\begin 目录下的BugSmak.sln 项目文件。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;为应用程序添加认证功能&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;运行应用程序，此时应用程序尚不能对用户进行认证。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;1. 打开Security \ SecurityHelper.cs代码文件，添加如下命名空间的引用。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;using&lt;/span&gt;&lt;span style="font-size: 9pt"&gt; System.Web.Security; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 添加如下代码到Authenticate 方法。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; Authenticate(&lt;span style="color: blue"&gt;string&lt;/span&gt; username, &lt;span style="color: blue"&gt;string&lt;/span&gt; password)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;bool&lt;/span&gt; authenticated = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;b&gt;&lt;span style="color: #c00000"&gt;authenticated = Membership.ValidateUser(username, password);&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// TODO: Get Roles&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;return&lt;/span&gt; authenticated;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;LoginForm调用Authenticate方法对用户进行验证。Membership.ValidateUser方法执行验证操作。Membership system使用Provider 模式，因此应用程序不会绑定到特定的数据。ASP.NET 提供了2个membership provider：一个是使用Microsoft SQL Server作为数据源，另一个则使用Windows Active Directory。&lt;/div&gt;
&lt;div&gt;也可以创建定制的membership provider，范例程序将从XML文件中读取应用程序的成员信息。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 打开项目中的Security | Providers | ReadOnlyXmlMembershipProvider.cs代码文件。&lt;/div&gt;
&lt;div&gt;ReadOnlyXmlMembershipProvider继承MembershipProvider，是一个定制的membership provider，读取一个未加密的XML文件。虽然这不是一个好的设计，但对本练习而言是合适的。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;4. 打开项目中的app.config 配置文件，检查membership provider 配置，认证数据源设定为Users.xml文件。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;membership&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;defaultProvider&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;b&gt;&lt;span style="color: #c00000"&gt;ReadOnlyXmlMembershipProvider&lt;/span&gt;&lt;/b&gt;"&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;providers&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;add&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;name&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;b&gt;&lt;span style="color: #c00000"&gt;ReadOnlyXmlMembershipProvider&lt;/span&gt;&lt;/b&gt;"&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;             &lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;type&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;b&gt;&lt;span style="color: #c00000"&gt;BugSmak.Security.Providers.ReadOnlyXmlMembershipProvider, BugSmak&lt;/span&gt;&lt;/b&gt;"&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;             &lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;description&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;Read-only XML membership provider&lt;/span&gt;"&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;             &lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;xmlFileName&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;b&gt;&lt;span style="color: #c00000"&gt;Users.xml&lt;/span&gt;&lt;/b&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;providers&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;membership&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;一旦你有定制的membership provider，你可以和配置ASP.NET provider一样，在应用程序中配置使用定制的membership provider。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;5. 打开Users.xml文件，可以看到已经运行添加了Tom / Dick / Harry 等等用户。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;6. 现在运行范例程序，以Tom / Dick / Harry 可以验证通过，并登录。&lt;/div&gt;
&lt;div&gt;本范例程序是一个简单的bug跟踪系统的框架，提供了如下功能点：提出Bug，分配Bug给开发人员，解决Bug。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="368" height="234" src="/userfiles/entlibforum/image/EnterpriseLibrary/Security/Security_1_1.gif" /&gt; &lt;/div&gt;
&lt;div&gt;7. 以Tom用户登录，选择 Tasks | Raise New Bug 菜单项，将看如下提示信息：&lt;/div&gt;
&lt;div&gt;Sorry, you aren’t allowed to access that form.&lt;/div&gt;
&lt;div&gt;同样地，在访问Assign Bug 和 Resolve Bug是也会出现上述提示信息，退出应用程序。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;为应用程序添加基于角色的授权&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 打开TaskForms \ RaiseBug.cs文件，查看代码。&lt;/div&gt;
&lt;div&gt;RaiseBug窗口需要用户有Developer、Employee、或Manager角色之一。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        [&lt;span style="color: #2b91af"&gt;PrincipalPermission&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;SecurityAction&lt;/span&gt;.Demand, Role = &lt;span style="color: #a31515"&gt;"Employee"&lt;/span&gt;)]&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        [&lt;span style="color: #2b91af"&gt;PrincipalPermission&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;SecurityAction&lt;/span&gt;.Demand, Role = &lt;span style="color: #a31515"&gt;"Developer"&lt;/span&gt;)]&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        [&lt;span style="color: #2b91af"&gt;PrincipalPermission&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;SecurityAction&lt;/span&gt;.Demand, Role = &lt;span style="color: #a31515"&gt;"Manager"&lt;/span&gt;)]&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;RaiseBug&lt;/span&gt; Create()&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// TODO: Check Authorization&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;RaiseBug&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;如果不具备必要的权限，将抛出SecurityException异常，由MainForm主窗体捕获。&lt;/div&gt;
&lt;div&gt;用户认证以及实现了，用户角色还没有实现，在后面的内容中，应用程序将配置使用RoleProvider来检索用户角色。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 打开Security \ SecurityHelper.cs 代码文件，为 Authenticate方法添加如下代码。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; Authenticate(&lt;span style="color: blue"&gt;string&lt;/span&gt; username, &lt;span style="color: blue"&gt;string&lt;/span&gt; password)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;bool&lt;/span&gt; authenticated = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            authenticated = &lt;span style="color: #2b91af"&gt;Membership&lt;/span&gt;.ValidateUser(username, password);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;b&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (!authenticated)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;IIdentity&lt;/span&gt; identity;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;            identity = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericIdentity&lt;/span&gt;(username, &lt;span style="color: #2b91af"&gt;Membership&lt;/span&gt;.Provider.Name);&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;string&lt;/span&gt;[] roles = &lt;span style="color: #2b91af"&gt;Roles&lt;/span&gt;.GetRolesForUser(identity.Name);&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;IPrincipal&lt;/span&gt; principal = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;GenericPrincipal&lt;/span&gt;(identity, roles);&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// Place user's principal on the thread&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.CurrentPrincipal = principal;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;return&lt;/span&gt; authenticated;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;通过定制的RoleProvider(ReadOnlyXmlRoleProvider.cs)从Users.xml文件中检索用户角色，并创建一个新的principal，包含用户的identity和角色。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 打开app.config配置文件，查看role manager provider的配置，指定的数据源为Users.xml文件。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;roleManager&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;enabled&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;true&lt;/span&gt;"&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;                 &lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;defaultProvider&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;b&gt;&lt;span style="color: #c00000"&gt;ReadOnlyXmlRoleProvider&lt;/span&gt;&lt;/b&gt;"&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;providers&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;add&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;name&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;b&gt;&lt;span style="color: #c00000"&gt;ReadOnlyXmlRoleProvider&lt;/span&gt;&lt;/b&gt;"&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;             &lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;type&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;b&gt;&lt;span style="color: blue"&gt;BugSmak.Security.Providers.ReadOnlyXmlRoleProvider, BugSmak&lt;/span&gt;&lt;/b&gt;"&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;             &lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;description&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;Read-only XML role provider&lt;/span&gt;"&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;             &lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;xmlFileName&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;b&gt;&lt;span style="color: blue"&gt;Users.xml&lt;/span&gt;&lt;/b&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;providers&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;roleManager&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;4. 运行范例程序&lt;/div&gt;
&lt;div&gt;分别以不同的用户Tom / Dick / Harry依次登录，确认不同用户有不同的访问权限。&lt;/div&gt;
&lt;div&gt;Tom (Employee) -- Raise new bug&lt;/div&gt;
&lt;div&gt;Dick (Developer) -- Raise new bug and resolve bug&lt;/div&gt;
&lt;div&gt;Harry (Manager) -- Raise new bug, resolve bug, and assign bug&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="546" height="445" src="/userfiles/entlibforum/image/EnterpriseLibrary/Security/Security_1_2.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.entlib.com/"&gt;http://www.entlib.com&lt;/a&gt;专业ASP.NET电子商务平台小组，欢迎你继续访问Security  Application Block学习手册。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;参考文档：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;Security Application Block Hands-On Labs for Enterprise Library&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/entlibforum/aggbug/222.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.entlib.com/entlibforum/comments/222.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.entlib.com/entlibforum/comments/commentRss/222.aspx</wfw:commentRss>
        <trackback:ping>http://blog.entlib.com/entlibforum/services/trackbacks/222.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Enterprise Library - Cryptography Application Block 学习手册（最新版） Part 2</title>
        <link rel="alternate" type="text/html" href="http://blog.entlib.com/entlibforum/archive/2009/10/11/enterprise-library-cryptography-application-block-part-2.aspx" />
        <id>http://blog.entlib.com/entlibforum/archive/2009/10/11/enterprise-library-cryptography-application-block-part-2.aspx</id>
        <published>2009-10-11T10:52:00Z</published>
        <updated>2009-10-11T10:53:40Z</updated>
        <summary type="html">本文继续Cryptography Application Block的学习，演示使用单向哈希算法（one-way hashing algorithm）加密存储在XML文件中的密码。&lt;br /&gt;
......&lt;br /&gt;
选择Cryptography Application Block | Hash Providers 节点，添加 New | HashAlgorithm Provider，创建一个新的HashAlgorithm提供者。
&lt;div style="text-align: center"&gt;&lt;img alt="" width="596" height="278" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_2_4.gif" /&gt;&lt;/div&gt;</summary>
        <content type="html">&lt;div align="center"&gt;&lt;b&gt;Enterprise Library - Cryptography Application Block &lt;/b&gt;&lt;b&gt;学习手册（最新版） Part 2&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本文继续Cryptography Application Block的学习，演示使用单向哈希算法（one-way hashing algorithm）加密存储在XML文件中的密码。本文由&lt;a href="http://blog.entlib.com/"&gt;http://blog.entlib.com&lt;/a&gt; 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供，欢迎交流。&lt;/div&gt;
&lt;div&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;练习二：使用HashProvider&lt;/b&gt;&lt;b&gt;存储单向哈希密码 &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;首先打开ex02\begin 目录下的UserUI.sln 项目文件，该应用程序提供了管理XML配置文件中的用户名和密码。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;范例应用程序简要描述&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 运行范例程序，输入用户名Elmo，并保持默认的密码（P@ssw0rd）不变，点击OK按钮。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="569" height="446" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_2_1.gif" /&gt; &lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;添加一个新的用户Zoe，重复上面的步骤。点击Save按钮，将保存上述信息到UserStore.config文件中。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 关闭应用程序，在Visual Studio 中打开UserStore.config配置文件，你会发现password以明文的形式保存在配置文件中。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;xml&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;version&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;1.0&lt;/span&gt;"&lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;utf-8&lt;/span&gt;"&lt;span style="color: blue"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;configuration&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;configSections&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;section&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;name&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;userStore&lt;/span&gt;"&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;UserStore.Configuration.UserSettings, UserStore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;configSections&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;userStore&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;users&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;add&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;name&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;EntLib.com&lt;/span&gt;"&lt;span style="color: red"&gt;password&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;P@ssw0rd&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;add&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;name&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;Forum&lt;/span&gt;"&lt;span style="color: red"&gt;password&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;P@ssw0rd&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;users&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;userStore&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;configuration&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;使用前一节的对称加密密钥对密码进行加密并不是一个好的方法，因为会影响密码的安全性。一般采用单向哈希算法，在和已存储的哈希密码（一般存储在数据库中）进行比较之前，先对输入的密码进行哈希。在这种情况下，即使数据库泄漏，密码仍然是安全的。&lt;/div&gt;
&lt;div&gt;在进行哈希算法之前，对密码添加额外的Salt，使得密码更难以破解。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;配置Hash Provider&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 使用Enterprise Library的配置管理工具打开项目中的app.config配置文件。配置文件已经定义了2个配置源（Configuration Source），应用程序使用Enterprise Library 中配置的封装类来管理UserStore.config的位置和内容，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="619" height="293" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_2_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 右键点击应用程序配置文件，选择New | Cryptography Application Block，为配置文件添加Cryptography application block的配置节点。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="677" height="325" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_2_3.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 选择Cryptography Application Block | Hash Providers 节点，添加 New | HashAlgorithm Provider，创建一个新的HashAlgorithm提供者。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="596" height="278" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_2_4.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;4. 在弹出的Type Selector 对话框中，选择SHA1Managed类型，然后点击OK按钮。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="685" height="488" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_2_5.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;对于哈希算法，推荐使用SHA256Managed算法，该使用使用256位的哈希大小，而SHA1Managed哈希算法是160位，该算法也可以接受。MD4和MD5算法则不再推荐使用。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;5. 选择Cryptography Application Block | Hash Providers | SHA1Managed节点，设置如下属性：&lt;/div&gt;
&lt;div&gt;Name = PasswordHasher&lt;/div&gt;
&lt;div&gt;SaltEnabled = True&lt;/div&gt;
&lt;div&gt;最后，保存好配置文件。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;使用哈希算法&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 选择Solution Provider中的UserStore项目，添加对Cryptography.dll程序集的引用。&lt;/div&gt;
&lt;div&gt;Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 打开Security | HashHelper.cs文件（在UserStore项目中），添加如下命名空间的引用：&lt;/div&gt;
&lt;div&gt;using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 打开HashProvider类，添加如下代码：&lt;/div&gt;
&lt;div&gt;class HashHelper&lt;/div&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt;&lt;span&gt;    private HashHelper() { }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;span&gt;    // TODO: Hash provider name must match app.config&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;span style="color: #c00000"&gt;    private const string hashProvider = "PasswordHasher";&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;span&gt;    . . .&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt;常量值必须匹配app.config配置文件中已命名的hash provider。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;4. 修改CreateHash方法，如下所示。&lt;/div&gt;
&lt;div&gt;public static string CreateHash(string plainText)&lt;/div&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt;&lt;span&gt;    string hash = null;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;span&gt;    // TODO: Hash the plain text&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;span style="color: #c00000"&gt;    hash = Cryptographer.CreateHash(hashProvider, plainText);&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;span&gt;    return hash;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt;在内存中的敏感数据需要尽快清除。在内存中的未加密数据存在安全风险。需要了解的是在内存中的数据也有可能写到硬盘上，因此操作系统可能将数据写到交换文件上。此外，如果系统崩溃，操作系统也会将内存中的数据写到硬盘上。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;5. 运行范例程序，重置Elmo的密码，点击Reset Password按钮，保留默认的密码（P@ssw0rd），然后点击OK按钮。UserStore.config配置文件中，当前明文保存的密码信息将替换为密码的哈希值。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="509" height="449" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_2_6.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;6. 对用户Zoe也采用相同的步骤。&lt;/div&gt;
&lt;div&gt;7. 点击Save按钮，保存对UserStore.config的修改。&lt;/div&gt;
&lt;div&gt;8. 尝试更改Elmo的密码。点击Change Password按钮，输入默认的旧密码P@ssw0rd，然后数据新的密码，如EntLib，点击OK按钮。但是，此时会发生验证现有密码失败。为什么呢？看看后面的解释。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="598" height="445" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_2_7.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;9. 点击Close按钮，关闭应用程序。&lt;/div&gt;
&lt;div&gt;10. 在Visual Stuido中打开UserStore.config文件，发现密码都已经哈希了。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;xml&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;version&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;1.0&lt;/span&gt;"&lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;utf-8&lt;/span&gt;"&lt;span style="color: blue"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;configuration&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;configSections&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;section&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;name&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;userStore&lt;/span&gt;"&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;UserStore.Configuration.UserSettings, UserStore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;configSections&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;userStore&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;users&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;add&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;name&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;EntLib.com&lt;/span&gt;"&lt;span style="color: red"&gt;password&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;3kHeDQo7uDI6Pj7890is1EiNGGjBB6ImxpB5LJkCFV+hY3Kp&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;add&lt;/span&gt;&lt;span style="color: red; font-size: 9pt"&gt;name&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;=&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;"&lt;span style="color: blue"&gt;Forum&lt;/span&gt;"&lt;span style="color: red"&gt;password&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;SBRc6JsFweEbxRfBStukevhur7RB3GpqaPLJRVymuK5WZ0e9&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;users&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;userStore&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;configuration&lt;/span&gt;&lt;span style="color: blue; font-size: 9pt"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;注意每种情况下，哈希值是不同的，即使实际的密码是相同的，这是因为额外的Salt。因此为了验证密码的有效性，我们不能简单应用对明文密码进行哈希计算，然后比较2个哈希字符串。&lt;/div&gt;
&lt;div&gt;11. 打开Security | HashHelper.cs文件（在UserStore项目中），修改CompareHash方法中的如下代码。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; CompareHash(&lt;span style="color: blue"&gt;string&lt;/span&gt; plainText, &lt;span style="color: blue"&gt;string&lt;/span&gt; hashedText)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;bool&lt;/span&gt; compare = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;b&gt;&lt;span style="color: #c00000"&gt;compare = Cryptographer.CompareHash(hashProvider, plainText, hashedText);&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;return&lt;/span&gt; compare;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;12. 再次运行应用程序，修改Elmo的密码 – 点击Change Password按钮，这次一定会成功。&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.entlib.com/"&gt;http://www.entlib.com&lt;/a&gt;专业ASP.NET电子商务平台小组，欢迎你继续访问Cryptography  Application Block学习手册。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;参考文档：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;Cryptography Application Block Hands-On Labs for Enterprise Library&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/entlibforum/aggbug/221.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.entlib.com/entlibforum/comments/221.aspx</wfw:comment>
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://blog.entlib.com/entlibforum/comments/commentRss/221.aspx</wfw:commentRss>
        <trackback:ping>http://blog.entlib.com/entlibforum/services/trackbacks/221.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Enterprise Library - Cryptography Application Block 学习手册（最新版） Part 1</title>
        <link rel="alternate" type="text/html" href="http://blog.entlib.com/entlibforum/archive/2009/10/11/enterprise-library-cryptography-application-block-part-1.aspx" />
        <id>http://blog.entlib.com/entlibforum/archive/2009/10/11/enterprise-library-cryptography-application-block-part-1.aspx</id>
        <published>2009-10-11T00:29:48Z</published>
        <updated>2009-10-11T00:29:48Z</updated>
        <summary type="html">本系列文章演示如何保护非配置文件中的信息，这里以一个模拟及时通讯（Instant Messenger）应用程序为例，升级应用程序以加密的消息，而不是明文消息来进行交谈。&lt;br /&gt;
......&lt;br /&gt;
对应用程序添加app.config配置文件，并使用Enterprise Library 配置工具打开app.config配置文件，添加Cryptography Application Block配置项，如下图所示。
&lt;div style="text-align: center"&gt;&lt;img width="645" height="313" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_3.gif" /&gt;&lt;/div&gt;</summary>
        <content type="html">&lt;div align="center"&gt;&lt;b&gt;Enterprise Library - Cryptography Application Block &lt;/b&gt;&lt;b&gt;学习手册（最新版） Part 1&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本系列文章演示如何保护非配置文件中的信息，这里以一个模拟及时通讯（Instant Messenger）应用程序为例，升级应用程序以加密的消息，而不是明文消息来进行交谈。&lt;/div&gt;
&lt;div&gt;本文由&lt;a href="http://blog.entlib.com/"&gt;http://blog.entlib.com&lt;/a&gt; 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供，欢迎交流。&lt;/div&gt;
&lt;div&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;练习一：加密和解密数据信息 &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;首先打开ex01\begin 目录下的ChatterBox.sln 项目文件。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;范例应用程序简要描述&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 以设计模式方式打开项目文件中的Chat.cs文件，如下图所示。&lt;/div&gt;
&lt;div&gt;该窗体用来发送和接收及时谈话信息，上面的文本框用来显示交谈记录，下面的文本框用来发送新的信息。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="338" height="481" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_1.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;2. 运行范例程序，将打开2个窗口（一个是Sam，另一个是Toby）。&lt;/div&gt;
&lt;div&gt;可以在这两个窗口之间传递消息。选择Tody 窗口，在Toby Says 对话框输入消息，然后点击Send按钮。同样的在Sam窗口进行相同操作。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;同时也会显示一个Console窗口，该窗口作为对话监视器，每一个消息都将在Console窗口显示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="688" height="578" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;在两个窗口之间传递的消息为明文。下面将使用Cryptography Application Block的对称密钥（Symmetric Key）来加密和解密这些对话信息。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;添加加密和解密&lt;/div&gt;
&lt;div&gt;1. 为项目添加如下程序集&lt;/div&gt;
&lt;div&gt;Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 打开Chat.cs代码文件，添加对如下命名空间的引用。&lt;/div&gt;
&lt;div&gt;using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 添加如下代码到Chat类中（红色粗体显示）&lt;/div&gt;
&lt;div&gt;public partial class Chat : Form&lt;/div&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt;&lt;span&gt;    // TODO: Configuration symmetric algorithm provider name&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;    &lt;b&gt;&lt;span style="color: #c00000"&gt;private const string symmProvider = "ChatProvider";&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-indent: 21pt"&gt;. . .&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt;上述常量必须匹配一个命名的对称加密提供者（Symmetric Cryptography Provider），本文后面部分会介绍，在App.config配置文件中symmetricCryptoProviders节。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;4. 修改SendMessage方法，使用Cryptographer加密消息（红色粗体显示）&lt;/div&gt;
&lt;div&gt;private void SendMessage(string message)&lt;/div&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div&gt;&lt;span&gt;    // TODO: Encrypt message&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;   &lt;b&gt;&lt;span style="color: #c00000"&gt; string encrypted = Cryptographer.EncryptSymmetric(symmProvider, message);&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;span&gt;    // Raise SendingMessage Event&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;    if (this.SendingMessage != null)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;        this.SendingMessage(new MessageEventArgs(this._name, &lt;b&gt;&lt;span style="color: #c00000"&gt;encrypted&lt;/span&gt;&lt;/b&gt;));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;5. 修改MessageReceived方法，使用Cryptographer方法解密消息（红色粗体显示）&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; MessageReceived(&lt;span style="color: #2b91af"&gt;MessageEventArgs&lt;/span&gt; args)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;string&lt;/span&gt; message = args.Message;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// TODO: Decrypt message&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;b&gt;&lt;span style="color: #c00000"&gt;string plainText = Cryptographer.DecryptSymmetric(symmProvider, message);&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;this&lt;/span&gt;.txtMessages.AppendText(&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                args.Sender + &lt;span style="color: #a31515"&gt;" says: "&lt;/span&gt; + &lt;b&gt;&lt;span style="color: #c00000"&gt;plainText&lt;/span&gt;&lt;/b&gt; + &lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.NewLine);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;修改应用程序配置文件&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 对应用程序添加app.config配置文件，并使用Enterprise Library 配置工具打开app.config配置文件，添加Cryptography Application Block配置项，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="645" height="313" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_3.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 选择 Cryptography Application Block | Symmetric Providers 节点，接着点击New | Symmetric Algorithm Provider 菜单项，如下图所示。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="619" height="233" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_4.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;随即弹出Type Selector 对话框，如下图所示。选择 RijndaelManaged类型，点击 OK 按钮。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="614" height="475" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_5.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;如果加密算法被破解或者易于受到攻击，则加密算法没有安全性。如果定制的算法没有经过测试验证，一般不太安全。因此，我们选择经过已公开的、众所周知的、且经受住多年攻击的加密算法。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;随着计算能力的提高，推荐的密钥长度也发生变化。目前，加密密钥长度在128位到256位认为是安全的。大多数现代的算法使用至少128位长的密钥。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;对称加密算法-AES，也称为Rijndael，推荐使用。该算法支持的密钥长度为128、192、和256位。DES算法不推荐使用。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 在Cryptographic Key 向导对话框中，选择Create a new key 选项，然后点击Next按钮，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="433" height="272" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_6.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;该向导将引导创建和保护加密密钥。点击Generate 按钮创建一个新的密钥，然后点击Next 按钮，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="446" height="280" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_7.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;在下一步保存加密文件的对话框中，将文件保存在本地的任何一个地方（你可以考虑保存在桌面），然后点击Next按钮，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="677" height="382" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_8.gif" /&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;在向导的最后一步，选择User mode 或者 Machine mode模式，点击Finish 按钮，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="431" height="279" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_9.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;在创建密钥时，你可选择Machine mode 或者 User mode。&lt;/div&gt;
&lt;div&gt;Machine mode一般在如下情况下使用：&lt;/div&gt;
&lt;div&gt;（1）你的应用程序运行在自己的特定服务器上，且没有其他的应用程序。&lt;/div&gt;
&lt;div&gt;（2）你有多个应用程序运行在相同的服务器上，你希望这些应用程序能够共享敏感信息。&lt;/div&gt;
&lt;div&gt;User mode则一般在如下情况下采用：&lt;/div&gt;
&lt;div&gt;在共享的环境运行应用程序，但确保Server上其他应用程序不能访问该应用程序的敏感信息。在这种情况下，每个应用程序都在隔离的环境下运行，且应用程序的资源，如文件和数据库等等，都限制只有应用程序自身才可以访问。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;4. 选择Cryptography Application Block | Symmetric Providers | RijndaelManaged 节点，设置如下属性： Name = ChatProvider&lt;/div&gt;
&lt;div&gt;ChatProvider是对称加密提供者的名称，在前面的代码中有使用到。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;最后，记得要保存好配置文件。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;运行应用程序&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;在Toby和Sam之间传递消息，在Console窗口发现消息已经加密了，但是在接收端，正确解密出明文信息。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="680" height="572" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/Cryptography/Cryptography_1_10.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;你或许会注意到在使用Cryptographer之后，应用程序会有些不稳定（如发生空白消息）。通常，我们需要在加密或解密字符串之前，需要添加一些代码进行检查。如，在SendMessage和MessageReceived方法中，检查字符串的长度是否为0。在MessageReceived方法，对解密的字符串，还需要检查长度是否为4个字节的整数倍，且仅含有有效Base64字符。这里为了简便，忽略了这些。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;添加错误处理&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;处理异常最好的办法是确保在最前面的地方添加检查代码，确保异常不要发生。首先，确保不要加密0长度的字符串。在项目Chat.cs文件中的SendMessage方法，添加如下代码。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SendMessage(&lt;span style="color: blue"&gt;string&lt;/span&gt; message)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;b&gt;&lt;span style="color: #c00000"&gt;if ((message != null) &amp;amp;&amp;amp; (message.Trim().Length &amp;gt; 0))&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: green"&gt;// TODO: Encrypt message&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;string&lt;/span&gt; encrypted = &lt;span style="color: #2b91af"&gt;Cryptographer&lt;/span&gt;.EncryptSymmetric(symmProvider, message);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: green"&gt;// Fire SendingMessage Event&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.SendingMessage != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    &lt;span style="color: blue"&gt;this&lt;/span&gt;.SendingMessage(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageEventArgs&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;._name, encrypted));&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.entlib.com/"&gt;http://www.entlib.com&lt;/a&gt;专业ASP.NET电子商务平台小组，欢迎你继续访问Cryptography  Application Block学习手册。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;参考文档：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;Cryptography Application Block Hands-On Labs for Enterprise Library&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/entlibforum/aggbug/220.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.entlib.com/entlibforum/comments/220.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.entlib.com/entlibforum/comments/commentRss/220.aspx</wfw:commentRss>
        <trackback:ping>http://blog.entlib.com/entlibforum/services/trackbacks/220.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Enterprise Library - Caching Application Block 学习手册（最新版） Part 3</title>
        <link rel="alternate" type="text/html" href="http://blog.entlib.com/entlibforum/archive/2009/09/30/enterprise-library-caching-application-block-part-3.aspx" />
        <id>http://blog.entlib.com/entlibforum/archive/2009/09/30/enterprise-library-caching-application-block-part-3.aspx</id>
        <published>2009-09-30T22:52:40Z</published>
        <updated>2009-09-30T22:52:40Z</updated>
        <summary type="html">本文演示如何在不同的应用程序中使用Enterprise Library - Caching Application Block模块，下面介绍了使用后台线程来装载缓存。&lt;br /&gt;
......&lt;br /&gt;
在应用程序在线时，后台线程将缓存员工图片。缓存保存在独立的存储区域，但是使用和上一节不同的PartitionName（partitionName="EmployeeBrowser_ex03"），这样缓存内容不会相互干扰。&lt;br /&gt;
&lt;div style="text-align: center"&gt;&lt;img width="667" height="276" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_3_1.gif" /&gt;&lt;/div&gt;</summary>
        <content type="html">&lt;div align="center"&gt;&lt;b&gt;Enterprise Library - Caching Application Block &lt;/b&gt;&lt;b&gt;学习手册（最新版） Part 3&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本文演示如何在不同的应用程序中使用Enterprise Library - Caching Application Block模块，下面介绍了使用后台线程来装载缓存。&lt;/div&gt;
&lt;div&gt;本文由&lt;a href="http://blog.entlib.com/"&gt;http://blog.entlib.com&lt;/a&gt; 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供，欢迎交流。&lt;/div&gt;
&lt;div&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;练习三：实现后台异步缓存&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;首先打开ex03\begin 目录下的EmployeeBrowser.sln 项目文件。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;实现数据库服务器在线时，后台线程预先装载缓存&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 打开项目中的EmployeeService.cs代码文件，添加如下2个方法，用来在后台装载缓存。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; PopulateCache()&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] photoData = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;EmployeesDataSet&lt;/span&gt; dsEmployees = GetContactDetails();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (dsEmployees == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ICacheManager&lt;/span&gt; cache = &lt;span style="color: #2b91af"&gt;CacheFactory&lt;/span&gt;.GetCacheManager();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;EmployeesDataSet&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;EmployeesRow&lt;/span&gt; employee &lt;span style="color: blue"&gt;in&lt;/span&gt; dsEmployees.Employees)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;if&lt;/span&gt; (!cache.Contains(employee.EmployeeID.ToString()))&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    &lt;span style="color: #2b91af"&gt;EmployeeDataProvider&lt;/span&gt; dataProvider = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EmployeeDataProvider&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    photoData = dataProvider.GetEmployeePhotoData(employee.EmployeeID);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    &lt;b&gt;cache.Add(employee.EmployeeID.ToString(), photoData);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;delegate&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PopulateCacheDelegate&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; BeginBackgroundLoad()&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (!&lt;span style="color: #2b91af"&gt;ConnectionManager&lt;/span&gt;.IsOnline)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;PopulateCacheDelegate&lt;/span&gt; mi = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PopulateCacheDelegate&lt;/span&gt;(PopulateCache);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            mi.BeginInvoke(&lt;span style="color: blue"&gt;null&lt;/span&gt;, &lt;span style="color: blue"&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;BeginBackgroundLoad 方法使用delegate在后台线程启动PopulateCache方法。PopulateCache方法遍历所有的员工，并缓存对应的图片（注：这不是很安全，因为用户可能在另一个线程中添加或删除记录）。更好的办法是，选取部分记录，然后进行遍历并缓存。&lt;/div&gt;
&lt;div&gt;Caching Application Block在使用缓存时，确保线程安全，因此同时从多个线程访问时，是安全的。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 打开MainForm.cs代码文件，找到MainForm_Load方法，添加启动后台线程工作的代码。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; MainForm_Load(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;this&lt;/span&gt;.ToolStripLabel1.Text = &lt;span style="color: #2b91af"&gt;ConnectionManager&lt;/span&gt;.StatusText;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// Load data into the 'EmployeesDataSet'.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;EmployeesDataSet&lt;/span&gt; tempDataset = &lt;span style="color: #2b91af"&gt;EmployeeService&lt;/span&gt;.GetContactDetails();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (tempDataset != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;this&lt;/span&gt;.EmployeesDataSet.Merge(tempDataset);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;           &lt;b&gt; &lt;span style="color: #2b91af"&gt;EmployeeService&lt;/span&gt;.BeginBackgroundLoad();&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;运行范例程序&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 运行范例程序，现在不需要浏览任何员工，但需要等待约10秒，然后退出应用程序。&lt;/div&gt;
&lt;div&gt;在应用程序在线时，后台线程将缓存员工图片。缓存保存在独立的存储区域，但是使用和上一节不同的PartitionName（partitionName="EmployeeBrowser_ex03"），这样缓存内容不会相互干扰。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="667" height="276" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_3_1.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 打开ConnectionManager.cs代码文件，修改IsOnline属性，模拟应用程序处于离线状态。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; IsOnline&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;b&gt;&lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;false&lt;/span&gt;; }&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 再次运行范例程序，现在应用程序处于离线状态，不能访问数据库，但是所有员工的联系信息和图片都已经缓存了，因此可以顺利浏览所有员工信息。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="602" height="520" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_3_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.entlib.com/"&gt;http://www.entlib.com&lt;/a&gt;专业ASP.NET电子商务平台小组，欢迎你继续访问Caching Application Block学习手册。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;参考文档：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;Caching Application Block Hands-On Labs for Enterprise Library&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/entlibforum/aggbug/219.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.entlib.com/entlibforum/comments/219.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.entlib.com/entlibforum/comments/commentRss/219.aspx</wfw:commentRss>
        <trackback:ping>http://blog.entlib.com/entlibforum/services/trackbacks/219.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Enterprise Library - Caching Application Block 学习手册（最新版） Part 2</title>
        <link rel="alternate" type="text/html" href="http://blog.entlib.com/entlibforum/archive/2009/09/29/enterprise-library-caching-application-block-part-2.aspx" />
        <id>http://blog.entlib.com/entlibforum/archive/2009/09/29/enterprise-library-caching-application-block-part-2.aspx</id>
        <published>2009-09-29T20:33:45Z</published>
        <updated>2009-09-29T20:33:45Z</updated>
        <summary type="html">本文演示如何在不同的应用程序中使用Enterprise Library - Caching Application Block模块，下面介绍了使用持久化后台存储（缓存）和离线缓存过期策略。
&lt;br /&gt;
配置持久化缓存
1. 使用Enterprise Library 的配置管理工具，打开app.config配置文件。&lt;br /&gt;
2. 选择Caching Application Block | Cache Managers | Cache Manager 节点，然后选择 New | Isolated Storage 菜单项。&lt;br /&gt;
&lt;div style="text-align: center"&gt;&lt;img width="623" height="279" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_2_1.gif" /&gt;&lt;/div&gt;</summary>
        <content type="html">&lt;div align="center"&gt;&lt;b&gt;Enterprise Library - Caching Application Block &lt;/b&gt;&lt;b&gt;学习手册（最新版） Part 2&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本文演示如何在不同的应用程序中使用Enterprise Library - Caching Application Block模块，下面介绍了使用持久化后台存储（缓存）和离线缓存过期策略。&lt;/div&gt;
&lt;div&gt;本文由&lt;a href="http://blog.entlib.com/"&gt;http://blog.entlib.com&lt;/a&gt; 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供，欢迎交流。&lt;/div&gt;
&lt;div&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;练习二：持久化缓存&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;首先打开ex02\begin 目录下的EmployeeBrowser.sln 项目文件。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;实现离线缓存&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 打开项目中的EmployeeService.cs代码文件，添加如下命名空间的引用：&lt;/div&gt;
&lt;div&gt;using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 找到代码中的GetContactDetails方法，添加如下代码：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EmployeesDataSet&lt;/span&gt; GetContactDetails()&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;EmployeesDataSet&lt;/span&gt; dsEmployees = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// Attempt to retrieve from cache&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ICacheManager&lt;/span&gt; cache = &lt;span style="color: #2b91af"&gt;CacheFactory&lt;/span&gt;.GetCacheManager();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            dsEmployees = (&lt;span style="color: #2b91af"&gt;EmployeesDataSet&lt;/span&gt;)cache[CACHE_KEY];&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// Retrieve from dataProvider if not in Cache and Online&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (dsEmployees == &lt;span style="color: blue"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;span style="color: #2b91af"&gt;ConnectionManager&lt;/span&gt;.IsOnline)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;               &lt;span style="color: #2b91af"&gt;EmployeeDataProvider&lt;/span&gt; dataProvider = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EmployeeDataProvider&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                dsEmployees = dataProvider.GetEmployees();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: green"&gt;// Expire in 2 days&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: #2b91af"&gt;AbsoluteTime&lt;/span&gt; expiry = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;AbsoluteTime&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;TimeSpan&lt;/span&gt;(2, 0, 0, 0));&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                cache.Add(CACHE_KEY, dsEmployees,&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    &lt;span style="color: #2b91af"&gt;CacheItemPriority&lt;/span&gt;.High, &lt;span style="color: blue"&gt;null&lt;/span&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ICacheItemExpiration&lt;/span&gt;[] { expiry });&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;return&lt;/span&gt; dsEmployees;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;上述代码实现在应用程序在线的时候，连接数据库。返回的数据集对象将添加到缓存中，并充分利用重载的Add方法，指定缓存的优先级和缓存过期策略。在这种情况下，用户保留在本地机器上的员工数据将不能超过2天，可以减少员工将这些信息泄露给其他公司的可能性，因为如果缓存过期将删除这些数据。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 修改GetemployeePhoto方法，在应用程序离线的情况下，不要连接数据库检索员工信息。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Bitmap&lt;/span&gt; GetEmployeePhoto(&lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt; employeeId)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] photoData = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// Attempt to retrieve from cache&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ICacheManager&lt;/span&gt; cache = &lt;span style="color: #2b91af"&gt;CacheFactory&lt;/span&gt;.GetCacheManager();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            photoData = (&lt;span style="color: blue"&gt;byte&lt;/span&gt;[])cache[employeeId.ToString()];&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// TODO: Retrieve from dataProvider if not in Cache and Online&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (photoData == &lt;span style="color: blue"&gt;null&lt;/span&gt; &lt;b&gt;&lt;span style="background: yellow"&gt;&amp;amp;&amp;amp; &lt;span style="color: #2b91af"&gt;ConnectionManager&lt;/span&gt;.IsOnline&lt;/span&gt;&lt;/b&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: #2b91af"&gt;EmployeeDataProvider&lt;/span&gt; dataProvider = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EmployeeDataProvider&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                photoData = dataProvider.GetEmployeePhotoData(employeeId);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                cache.Add(employeeId.ToString(), photoData);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// No data found.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (photoData == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// Convert bytes to Bitmap&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt; ms = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt;(photoData))&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Bitmap&lt;/span&gt;(ms);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;配置持久化缓存&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 使用Enterprise Library 的配置管理工具，打开app.config配置文件。&lt;/div&gt;
&lt;div&gt;2. 选择Caching Application Block | Cache Managers | Cache Manager 节点，然后选择 New | Isolated Storage 菜单项。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="623" height="279" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_2_1.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 选择Isolated Storage节点，设置PartitionName属性为 EmployeeBrowser。&lt;/div&gt;
&lt;div&gt;Partition Name允许多个缓存使用Isolated storage，相互之间不造成干扰。保存上述配置文件。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;运行范例程序&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 浏览部分员工，这里会缓存员工图片信息，但是不要浏览所有员工信息，没有浏览的员工，其图片则没有缓存（方便下一步进行对比），然后关闭应用程序。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 打开项目中的ConnectionManager.cs代码文件，修改IsOnline属性，如下所示，模拟应用程序处于离线状态。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; IsOnline&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;get&lt;/span&gt; { &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;false&lt;/span&gt;; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        }   &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;正常情况下，该类负责检测服务器的连接状态，判断是否Client处于在线状态，并连接数据库。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 再次运行范例程序，应用程序处于离线状态，不能访问数据库。现在需要从缓存中获取员工联系信息，包括员工图片，但是缓存中仅仅只有前面在线浏览过的员工图片信息，对于没有浏览过的员工信息，将仅仅显示员工信息，员工图片信息则无法显示，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_2_2.gif" /&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.entlib.com/"&gt;http://www.entlib.com&lt;/a&gt;专业ASP.NET电子商务平台小组，欢迎你继续访问Caching Application Block学习手册。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;参考文档：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;Caching Application Block Hands-On Labs for Enterprise Library&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/entlibforum/aggbug/218.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.entlib.com/entlibforum/comments/218.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.entlib.com/entlibforum/comments/commentRss/218.aspx</wfw:commentRss>
        <trackback:ping>http://blog.entlib.com/entlibforum/services/trackbacks/218.aspx</trackback:ping>
    </entry>
    <entry>
        <title>Enterprise Library - Caching Application Block 学习手册（最新版） Part 1</title>
        <link rel="alternate" type="text/html" href="http://blog.entlib.com/entlibforum/archive/2009/09/27/enterprise-library-caching-application-block-part-1.aspx" />
        <id>http://blog.entlib.com/entlibforum/archive/2009/09/27/enterprise-library-caching-application-block-part-1.aspx</id>
        <published>2009-09-27T23:15:31Z</published>
        <updated>2009-09-27T23:15:31Z</updated>
        <summary type="html">本文演示如何在不同的应用程序中使用Enterprise Library - Caching Application Block模块，需要SQL Server数据库。其中包含如下三个示例：&lt;br /&gt;
（1）使用Caching Block提供程序性能
（2）持久化Caching
（3）实现后台Caching &lt;br /&gt;
通过本文的学习，你可以学会在应用程序中应用Caching机制，同时掌握在后台填充缓存。
&lt;div style="text-align: center"&gt;&lt;img width="660" height="299" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_1_4.gif" /&gt;&lt;/div&gt;</summary>
        <content type="html">&lt;div align="center"&gt;&lt;b&gt;Enterprise Library - Caching Application Block &lt;/b&gt;&lt;b&gt;学习手册（最新版） Part 1&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本文演示如何在不同的应用程序中使用Enterprise Library - Caching Application Block模块，需要SQL Server数据库。其中包含如下三个示例：&lt;/div&gt;
&lt;div&gt;（1）使用Caching Block提供程序性能&lt;/div&gt;
&lt;div&gt;（2）持久化Caching&lt;/div&gt;
&lt;div&gt;（3）实现后台Caching&lt;/div&gt;
&lt;div&gt;通过本文的学习，你可以学会在应用程序中应用Caching机制，同时掌握在后台填充缓存。&lt;/div&gt;
&lt;div&gt;本文由&lt;a href="http://blog.entlib.com/"&gt;http://blog.entlib.com&lt;/a&gt; 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供，欢迎交流。&lt;/div&gt;
&lt;div&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;练习一：使用Caching Block&lt;/b&gt;&lt;b&gt;提高应用程序性能&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;范例程序演示通过caching 来加快员工数据的现实，并持久化缓存，支持offline。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;打开ex01\begin 文件夹下的EmployeeBrowser.sln文件。然后，在SQL Server Management Studio界面打开 \Enterprise Library 4.1 HOL\CS\Caching\setup 目录下的CachingHOL.sql文件，执行里面的SQL脚本。该脚本在EntLibQuickStarts数据库中创建Employees表，并初始化部分数据。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;范例应用程序概述&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;本范例程序用来展示存储在数据库中的员工信息，包括显示员工的图片。尽管应用程序在启动的时候，装载所有的员工记录，但是并不装载所有的图片信息，而是在显示特定员工信息时，才装载对应的图片。这是因为图片数据量比较大，如果在启动应用程序时，装载所有的图片数据，会严重影响启动速度。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;检查MainForm.cs文件中的MainForm_Load 方法，该方法调用EmployeeService类，EmployeeService又调用EmployeeDataPrvoider类来获取员工数据，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="628" height="229" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_1_1.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;当前，EmployeeService仅仅直接依赖EmployeeDataProvider类，下面将强化利用Caching Block，在应用程序离线的情况下，也可以运行正常。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;选择EmployeeDataProvider.cs文件，在代码文件中找到GetEmployeePhotoData方法，GetEmployeePhotoData方法中特别添加了1秒的延迟，用来模拟访问数据的延迟。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: green; font-size: 9pt"&gt;// HACK: Emulate a slow connection to the database.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #2b91af; font-size: 9pt"&gt;Thread&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;.Sleep(1000);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;现在运行范例程序，发现在浏览照片时，非常缓慢，即使你之前已经浏览过相应的照片。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="602" height="520" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_1_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;在EmployeeService&lt;/b&gt;&lt;b&gt;类实现缓存&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 选择EmployeeBrowser项目，添加对如下程序集的引用。&lt;/div&gt;
&lt;div&gt;Microsoft.Practices.EnterpriseLibrary.Caching.dll&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 打开EmployeeService.cs文件，在代码中添加对Caching命名空间的引用。&lt;/div&gt;
&lt;div&gt;using Microsoft.Practices.EnterpriseLibrary.Caching;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;3. 对GetEmployeePhoto方法添加如下代码。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Bitmap&lt;/span&gt; GetEmployeePhoto(&lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt; employeeId)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] photoData = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// Attempt to retrieve from cache&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ICacheManager&lt;/span&gt; cache = &lt;span style="color: #2b91af"&gt;CacheFactory&lt;/span&gt;.GetCacheManager();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            photoData = (&lt;span style="color: blue"&gt;byte&lt;/span&gt;[])cache[employeeId.ToString()];&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// Retrieve from dataProvider if not in Cache&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (photoData == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: #2b91af"&gt;EmployeeDataProvider&lt;/span&gt; dataProvider = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EmployeeDataProvider&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                photoData = dataProvider.GetEmployeePhotoData(employeeId);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                cache.Add(employeeId.ToString(), photoData);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// No data found.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (photoData == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: green"&gt;// Convert bytes to Bitmap&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt; ms = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MemoryStream&lt;/span&gt;(photoData))&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Bitmap&lt;/span&gt;(ms);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;仔细对比代码，仅仅新增了caching相关的代码机制。上述方法使用了工厂模式（Factory Pattern），和其他的Enterprise Library 的Application Block一样，创建一个新的CacheManager实例。缓存Cache可以完全在内存中，或者依托在物理存储空间，这由配置来决定。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;4. 添加如下的代码到ClearCache方法中，允许窗体请求服务获取新的数据。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ClearCache()&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ICacheManager&lt;/span&gt; cache = &lt;span style="color: #2b91af"&gt;CacheFactory&lt;/span&gt;.GetCacheManager();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            cache.Flush();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;上述方法将从Cache中删除所有数据。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;应用程序配置文件&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 使用Enterprise Library的配置文件编辑工具，打开应用程序中app.config配置文件，添加新的Caching Application Block配置，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="681" height="329" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_1_3.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 选择Caching Application Block | Cache Managers | Cache Manager 节点，在属性窗口中，可以看到一些可调整的属性设置，用来调整缓存的性能。这里保留这些设置不变，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="660" height="299" alt="" src="/userfiles/entlibforum/image/EnterpriseLibrary/caching/caching_1_4.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;保存配置文件，现在配置文件中包含有缓存配置设置。可以注意到后台存储设置为Null Storage，也就是，缓存信息将保留在内存中。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;现在运行范例程序，发现浏览员工信息的性能将发生很大变化。在第一次浏览员工信息时，因为需要从数据库中检索图片信息，因此比较缓慢，但再次访问相同员工的信息时，因为缓存中已经有数据，直接从缓存中获取信息，性能有显著改善。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.entlib.com/"&gt;&lt;font color="#0000ff"&gt;http://www.entlib.com&lt;/font&gt;&lt;/a&gt;专业ASP.NET电子商务平台小组，欢迎你继续访问Caching Application Block学习手册。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;参考文档：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;Caching Application Block Hands-On Labs for Enterprise Library&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/entlibforum/aggbug/217.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.entlib.com/entlibforum/comments/217.aspx</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.entlib.com/entlibforum/comments/commentRss/217.aspx</wfw:commentRss>
        <trackback:ping>http://blog.entlib.com/entlibforum/services/trackbacks/217.aspx</trackback:ping>
    </entry>
</feed>