EntLib.com 电子商务系统 - 后台业务处理系统(BES)- 用户操作手册(PDF文档下载)

EntLib.com 电子商务系统 - 后台业务处理系统(BES)- 用户操作手册(PDF文档下载)

PDF 阅读器官方下载地址:
http://get.adobe.com/cn/reader/

如果您的电脑上没有安装 PDF 阅读器,可以到上述的adobe 官方网站上下载PDF 阅读器,然后在本地电脑上安装。

后台业务系统-用户操作手册-下载地址:
http://forum.entlib.com/Default.aspx?g=posts&t=813

 

posted @ 2009年12月30日 18:35 | entlibforum 阅读 (296) | 评论 (0)

电子商务网站的快速SEO解决方案 (葵花宝典 - PDF 文档下载)

电子商务网站的快速SEO解决方案 (葵花宝典 - PDF 文档下载)
 
本文是EntLib.com 电子商务小组(http://www.EntLib.com )针对国内电子商务网站关于SEO的一些思考和建议,提供了一些常用的、简单可行的SEO行动方案。更 高级别的、有针对性的优化方案需要深入分析和探讨。
 
通过阅读本文,你可以实现如下目的:
  1. 了解电子商务网站的一些基本SEO规范。
  2. 了解一些免费的网站管理员工具。
  3. 本文提供的SEO改进方案简单实用,实现成本很小,但长期效果明显,对网站业务非常有帮助。
 
本文的大部分建议都基于SEO基本知识和我们的电子商务实践, 同时也参考业内的SEO专家文章和搜索引擎公司的官方文档。
 
本文的一些场景以礼品中心网(http://www.GiftCenter.cn )的内容为主进行分析,在此表示感谢。这些SEO技术都已经在EntLib.com eCommerce 电子商务系统中予以实现,因此在技术上和实现上都没有问题。
 
本文,对希望提高网站与用户和搜索引擎交互性的网站管理员们也一样会有帮助,所以我们对SEO相关内容进行整理完善,发表出来供大家参考。

这里提供《电子商务网站的快速SEO解决方案》完整的PDF 文档下载!




 
该PDF 文档共有 21 页,下面是《电子商务网站的快速SEO解决方案》的目录。

欢迎下载!如有建议或反馈,欢迎回复!谢谢!

 

 

posted @ 2009年10月26日 12:13 | entlibforum 阅读 (1054) | 评论 (0)

最新版 Enterprise Library 企业库 V4.1 中文学习手册 (提供整合的PDF文档下载)

最新版 Enterprise Library 企业库 V4.1 中文学习手册 (提供整合的PDF文档下载)
 
Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns & practices 小组为.NET Framework 3.5 开发一套企业库,目前最新版本为v4.1,共包括9个Application Block,包括数据访问(Data Access Application Block)、异常管理(Exception Handling Application Block)、数据验证(Validation Application Block)、日志管理、依赖注入容器Unity、缓存管理、加密/解密、安全管理等等,对企业应用开发非常有帮助,也非常实用。
 
 
http://forum.EntLib.com 开源论坛小组根据EntLib Hands-On Labs提供了全套的中文学习手册,同时也提供了整合的PDF 文档下载 --- 共有133页
 
 
文档及下载地址:
 
 

 

posted @ 2009年10月20日 13:50 | entlibforum 阅读 (1549) | 评论 (4)

Enterprise Library - Security Application Block 学习手册(最新版) Part 2

Enterprise Library - Security Application Block 学习手册(最新版) Part 2
 
本系列文章引导学习Enterprise Library - Security Application Block,并实践如何在不同的应用程序环境中使用Security Application Block的功能。前一节中,使用基于角色的授权来保护应用程序,这一节将练习使用AuthorizationProvider来保护应用程序。本文由http://blog.entlib.com 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供,欢迎交流。
 
使用AuthorizationProvider实现如下功能:
(1)映射基于任务的授权为复杂的角色组合;
(2)从应用程序代码中提取授权;
 
练习二:在应用程序中使用基于规则的授权(Rule-Based Authorization
首先打开ex02\begin 目录下的BugSmak.sln 项目文件。
 
使用Enterprise Library配置管理工具
1. 使用Enterprise Library配置工具打开app.config配置文件,添加新的Security Application Block配置项。
 
 
2. 选择Security Application Block | Authorization 节点,添加一个新的Authorization Rule Provider。
 
 
设置Name =BugSmak Rules。
 
3. 选择 Security Application Block | Authorization | BugSmak Rules 节点,通过New | Rule菜单项添加新的Rule。
 
 
4. 选择Security Application Block | Authorization | BugSmak Rules | Rule 节点,点击Expression属性后的… 按钮,弹出Rule Expression Editor对话框。
 
 
在Rule Expression Editor对话框中,设置如下属性:
Rule Name = Raise Bug
Expression = R:Developer OR R:Employee OR R:Manager
 
 
用户必须是Developer、Employee、或Manager角色。
 
5. 按照上述步骤,添加新的Rule和表达式。
规则名称:Assign Bug   --- 表达式Expression:R:Manager
规则名称:Resolve Bug   --- 表达式Expression:R:Developer OR R:Manager
 
设置完成后,界面如下图所示。
 
 
6. 选择Security Application Block节点,设置如下属性。
DefaultAuthorizationInstance = BugSmak Rules
 
最后保存好app.config配置文件。
 
为应用程序添加基于任务的授权
1. 打开TaskForms \ RaiseBug.cs代码文件,其中关于PrincipalPermissions部分的硬编码已经注释掉了,这里将采用更加灵活的任务授权。
        //[PrincipalPermission(SecurityAction.Demand, Role = "Employee")]
        //[PrincipalPermission(SecurityAction.Demand, Role = "Developer")]
        //[PrincipalPermission(SecurityAction.Demand, Role = "Manager")]
        public static RaiseBug Create()
        {
            // TODO: Check Authorization
            if (!SecurityHelper.Authorized(AuthRule.Raise))
            {
                throw new SecurityException();
            }
 
            return new RaiseBug();
        }
AssignBug.cs 和 ResolveBug.cs 有上述相似的代码。
 
2. 为项目文件添加对Security Application Block程序集的引用。
Microsoft.Practices.EnterpriseLibrary.Security.dll
 
3. 打开Security \ SecurityHelper.cs代码文件,添加如下命名空间的引用。
using Microsoft.Practices.EnterpriseLibrary.Security;
 
4. 添加如下代码到Authorized方法。
        public static bool Authorized(string rule)
        {
            bool authorized = false;
 
            // TODO: Check rule-base authorization
            IAuthorizationProvider ruleProvider;
            ruleProvider = AuthorizationFactory.GetAuthorizationProvider();
 
            authorized = ruleProvider.Authorize(Thread.CurrentPrincipal, rule);
 
            return authorized;
        }
 
上述代码使用AuthorizationFactory 检索默认的authorization provider,授权提供者将依据规则,测试当前的principal( role和identity)是否授权。
 
5. 运行应用程序,分别以不同的用户Tom / Dick / Harry登录,验证不同的用户是否分配了不同的权限。
http://www.entlib.com专业ASP.NET电子商务平台小组,欢迎你继续访问Security  Application Block学习手册。
 
参考文档:
Security Application Block Hands-On Labs for Enterprise Library
 

 

posted @ 2009年10月12日 19:53 | entlibforum 阅读 (1279) | 评论 (0)

Enterprise Library - Security Application Block 学习手册(最新版) Part 1

Enterprise Library - Security Application Block 学习手册(最新版) Part 1
 
本系列文章引导学习Enterprise Library - Security Application Block,并实践如何在不同的应用程序环境中使用Security Application Block的功能。本文由http://blog.entlib.com 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供,欢迎交流。
 
练习一:保护应用程序
首先打开ex01\begin 目录下的BugSmak.sln 项目文件。
 
为应用程序添加认证功能
运行应用程序,此时应用程序尚不能对用户进行认证。
 
1. 打开Security \ SecurityHelper.cs代码文件,添加如下命名空间的引用。
using System.Web.Security;
 
2. 添加如下代码到Authenticate 方法。
        public static bool Authenticate(string username, string password)
        {
            bool authenticated = false;
 
            authenticated = Membership.ValidateUser(username, password);
 
            // TODO: Get Roles
 
            return authenticated;
        }
LoginForm调用Authenticate方法对用户进行验证。Membership.ValidateUser方法执行验证操作。Membership system使用Provider 模式,因此应用程序不会绑定到特定的数据。ASP.NET 提供了2个membership provider:一个是使用Microsoft SQL Server作为数据源,另一个则使用Windows Active Directory。
也可以创建定制的membership provider,范例程序将从XML文件中读取应用程序的成员信息。
 
3. 打开项目中的Security | Providers | ReadOnlyXmlMembershipProvider.cs代码文件。
ReadOnlyXmlMembershipProvider继承MembershipProvider,是一个定制的membership provider,读取一个未加密的XML文件。虽然这不是一个好的设计,但对本练习而言是合适的。
 
4. 打开项目中的app.config 配置文件,检查membership provider 配置,认证数据源设定为Users.xml文件。
    <membershipdefaultProvider="ReadOnlyXmlMembershipProvider">
      <providers>
        <addname="ReadOnlyXmlMembershipProvider"
             type="BugSmak.Security.Providers.ReadOnlyXmlMembershipProvider, BugSmak"
             description="Read-only XML membership provider"
             xmlFileName="Users.xml" />
      </providers>
    </membership>
一旦你有定制的membership provider,你可以和配置ASP.NET provider一样,在应用程序中配置使用定制的membership provider。
 
5. 打开Users.xml文件,可以看到已经运行添加了Tom / Dick / Harry 等等用户。
 
6. 现在运行范例程序,以Tom / Dick / Harry 可以验证通过,并登录。
本范例程序是一个简单的bug跟踪系统的框架,提供了如下功能点:提出Bug,分配Bug给开发人员,解决Bug。
 
 
7. 以Tom用户登录,选择 Tasks | Raise New Bug 菜单项,将看如下提示信息:
Sorry, you aren’t allowed to access that form.
同样地,在访问Assign Bug 和 Resolve Bug是也会出现上述提示信息,退出应用程序。
 
为应用程序添加基于角色的授权
1. 打开TaskForms \ RaiseBug.cs文件,查看代码。
RaiseBug窗口需要用户有Developer、Employee、或Manager角色之一。
        [PrincipalPermission(SecurityAction.Demand, Role = "Employee")]
        [PrincipalPermission(SecurityAction.Demand, Role = "Developer")]
        [PrincipalPermission(SecurityAction.Demand, Role = "Manager")]
        public static RaiseBug Create()
        {
            // TODO: Check Authorization
 
            return new RaiseBug();
        }
 
如果不具备必要的权限,将抛出SecurityException异常,由MainForm主窗体捕获。
用户认证以及实现了,用户角色还没有实现,在后面的内容中,应用程序将配置使用RoleProvider来检索用户角色。
 
2. 打开Security \ SecurityHelper.cs 代码文件,为 Authenticate方法添加如下代码。
        public static bool Authenticate(string username, string password)
        {
            bool authenticated = false;
 
            authenticated = Membership.ValidateUser(username, password);
 
            if (!authenticated)
                return false;
 
            IIdentity identity;
            identity = new GenericIdentity(username, Membership.Provider.Name);
 
            string[] roles = Roles.GetRolesForUser(identity.Name);
            IPrincipal principal = new GenericPrincipal(identity, roles);
 
            // Place user's principal on the thread
            Thread.CurrentPrincipal = principal;
 
            return authenticated;
        }
通过定制的RoleProvider(ReadOnlyXmlRoleProvider.cs)从Users.xml文件中检索用户角色,并创建一个新的principal,包含用户的identity和角色。
 
3. 打开app.config配置文件,查看role manager provider的配置,指定的数据源为Users.xml文件。
    <roleManagerenabled="true"
                 defaultProvider="ReadOnlyXmlRoleProvider">
      <providers>
        <addname="ReadOnlyXmlRoleProvider"
             type="BugSmak.Security.Providers.ReadOnlyXmlRoleProvider, BugSmak"
             description="Read-only XML role provider"
             xmlFileName="Users.xml" />
      </providers>
    </roleManager>
 
4. 运行范例程序
分别以不同的用户Tom / Dick / Harry依次登录,确认不同用户有不同的访问权限。
Tom (Employee) -- Raise new bug
Dick (Developer) -- Raise new bug and resolve bug
Harry (Manager) -- Raise new bug, resolve bug, and assign bug
 

 
http://www.entlib.com专业ASP.NET电子商务平台小组,欢迎你继续访问Security  Application Block学习手册。
 
参考文档:
Security Application Block Hands-On Labs for Enterprise Library
 

 

posted @ 2009年10月12日 19:38 | entlibforum 阅读 (1598) | 评论 (1)

Enterprise Library - Cryptography Application Block 学习手册(最新版) Part 2

Enterprise Library - Cryptography Application Block 学习手册(最新版) Part 2
 
本文继续Cryptography Application Block的学习,演示使用单向哈希算法(one-way hashing algorithm)加密存储在XML文件中的密码。本文由http://blog.entlib.com 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供,欢迎交流。
 
练习二:使用HashProvider存储单向哈希密码
首先打开ex02\begin 目录下的UserUI.sln 项目文件,该应用程序提供了管理XML配置文件中的用户名和密码。
 
范例应用程序简要描述
1. 运行范例程序,输入用户名Elmo,并保持默认的密码(P@ssw0rd)不变,点击OK按钮。
 
 
 
添加一个新的用户Zoe,重复上面的步骤。点击Save按钮,将保存上述信息到UserStore.config文件中。
 
2. 关闭应用程序,在Visual Studio 中打开UserStore.config配置文件,你会发现password以明文的形式保存在配置文件中。
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
    <configSections>
        <sectionname="userStore"type="UserStore.Configuration.UserSettings, UserStore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </configSections>
    <userStore>
        <users>
            <addname="EntLib.com"password="P@ssw0rd" />
            <addname="Forum"password="P@ssw0rd" />
        </users>
    </userStore>
</configuration>
 
使用前一节的对称加密密钥对密码进行加密并不是一个好的方法,因为会影响密码的安全性。一般采用单向哈希算法,在和已存储的哈希密码(一般存储在数据库中)进行比较之前,先对输入的密码进行哈希。在这种情况下,即使数据库泄漏,密码仍然是安全的。
在进行哈希算法之前,对密码添加额外的Salt,使得密码更难以破解。
 
配置Hash Provider
1. 使用Enterprise Library的配置管理工具打开项目中的app.config配置文件。配置文件已经定义了2个配置源(Configuration Source),应用程序使用Enterprise Library 中配置的封装类来管理UserStore.config的位置和内容,如下图所示。
 
 
2. 右键点击应用程序配置文件,选择New | Cryptography Application Block,为配置文件添加Cryptography application block的配置节点。
 
 
3. 选择Cryptography Application Block | Hash Providers 节点,添加 New | HashAlgorithm Provider,创建一个新的HashAlgorithm提供者。
 
 
4. 在弹出的Type Selector 对话框中,选择SHA1Managed类型,然后点击OK按钮。
 
 
对于哈希算法,推荐使用SHA256Managed算法,该使用使用256位的哈希大小,而SHA1Managed哈希算法是160位,该算法也可以接受。MD4和MD5算法则不再推荐使用。
 
5. 选择Cryptography Application Block | Hash Providers | SHA1Managed节点,设置如下属性:
Name = PasswordHasher
SaltEnabled = True
最后,保存好配置文件。
 
使用哈希算法
1. 选择Solution Provider中的UserStore项目,添加对Cryptography.dll程序集的引用。
Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll
 
2. 打开Security | HashHelper.cs文件(在UserStore项目中),添加如下命名空间的引用:
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
 
3. 打开HashProvider类,添加如下代码:
class HashHelper
{
    private HashHelper() { }
 
    // TODO: Hash provider name must match app.config
    private const string hashProvider = "PasswordHasher";
 
    . . .
}
常量值必须匹配app.config配置文件中已命名的hash provider。
 
4. 修改CreateHash方法,如下所示。
public static string CreateHash(string plainText)
{
    string hash = null;
 
    // TODO: Hash the plain text
    hash = Cryptographer.CreateHash(hashProvider, plainText);
 
    return hash;
}
在内存中的敏感数据需要尽快清除。在内存中的未加密数据存在安全风险。需要了解的是在内存中的数据也有可能写到硬盘上,因此操作系统可能将数据写到交换文件上。此外,如果系统崩溃,操作系统也会将内存中的数据写到硬盘上。
 
5. 运行范例程序,重置Elmo的密码,点击Reset Password按钮,保留默认的密码(P@ssw0rd),然后点击OK按钮。UserStore.config配置文件中,当前明文保存的密码信息将替换为密码的哈希值。
 
 
6. 对用户Zoe也采用相同的步骤。
7. 点击Save按钮,保存对UserStore.config的修改。
8. 尝试更改Elmo的密码。点击Change Password按钮,输入默认的旧密码P@ssw0rd,然后数据新的密码,如EntLib,点击OK按钮。但是,此时会发生验证现有密码失败。为什么呢?看看后面的解释。
 
 
9. 点击Close按钮,关闭应用程序。
10. 在Visual Stuido中打开UserStore.config文件,发现密码都已经哈希了。
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
    <configSections>
        <sectionname="userStore"type="UserStore.Configuration.UserSettings, UserStore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </configSections>
    <userStore>
        <users>
            <addname="EntLib.com"password="3kHeDQo7uDI6Pj7890is1EiNGGjBB6ImxpB5LJkCFV+hY3Kp" />
            <addname="Forum"password="SBRc6JsFweEbxRfBStukevhur7RB3GpqaPLJRVymuK5WZ0e9" />
        </users>
    </userStore>
</configuration>
 
注意每种情况下,哈希值是不同的,即使实际的密码是相同的,这是因为额外的Salt。因此为了验证密码的有效性,我们不能简单应用对明文密码进行哈希计算,然后比较2个哈希字符串。
11. 打开Security | HashHelper.cs文件(在UserStore项目中),修改CompareHash方法中的如下代码。
        public static bool CompareHash(string plainText, string hashedText)
        {
            bool compare = false;
 
            compare = Cryptographer.CompareHash(hashProvider, plainText, hashedText);
 
            return compare;
        }
 
12. 再次运行应用程序,修改Elmo的密码 – 点击Change Password按钮,这次一定会成功。
http://www.entlib.com专业ASP.NET电子商务平台小组,欢迎你继续访问Cryptography  Application Block学习手册。
 
参考文档:
Cryptography Application Block Hands-On Labs for Enterprise Library
 

 

posted @ 2009年10月11日 10:52 | entlibforum 阅读 (1117) | 评论 (2)

Enterprise Library - Cryptography Application Block 学习手册(最新版) Part 1

Enterprise Library - Cryptography Application Block 学习手册(最新版) Part 1
 
本系列文章演示如何保护非配置文件中的信息,这里以一个模拟及时通讯(Instant Messenger)应用程序为例,升级应用程序以加密的消息,而不是明文消息来进行交谈。
本文由http://blog.entlib.com 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供,欢迎交流。
 
练习一:加密和解密数据信息
首先打开ex01\begin 目录下的ChatterBox.sln 项目文件。
 
范例应用程序简要描述
1. 以设计模式方式打开项目文件中的Chat.cs文件,如下图所示。
该窗体用来发送和接收及时谈话信息,上面的文本框用来显示交谈记录,下面的文本框用来发送新的信息。
 

 
2. 运行范例程序,将打开2个窗口(一个是Sam,另一个是Toby)。
可以在这两个窗口之间传递消息。选择Tody 窗口,在Toby Says 对话框输入消息,然后点击Send按钮。同样的在Sam窗口进行相同操作。
 
同时也会显示一个Console窗口,该窗口作为对话监视器,每一个消息都将在Console窗口显示。
 
 
在两个窗口之间传递的消息为明文。下面将使用Cryptography Application Block的对称密钥(Symmetric Key)来加密和解密这些对话信息。
 
添加加密和解密
1. 为项目添加如下程序集
Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll
 
2. 打开Chat.cs代码文件,添加对如下命名空间的引用。
using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
 
3. 添加如下代码到Chat类中(红色粗体显示)
public partial class Chat : Form
{
    // TODO: Configuration symmetric algorithm provider name
    private const string symmProvider = "ChatProvider";
. . .
}
上述常量必须匹配一个命名的对称加密提供者(Symmetric Cryptography Provider),本文后面部分会介绍,在App.config配置文件中symmetricCryptoProviders节。
 
4. 修改SendMessage方法,使用Cryptographer加密消息(红色粗体显示)
private void SendMessage(string message)
{
    // TODO: Encrypt message
    string encrypted = Cryptographer.EncryptSymmetric(symmProvider, message);
 
    // Raise SendingMessage Event
    if (this.SendingMessage != null)
        this.SendingMessage(new MessageEventArgs(this._name, encrypted));
}
 
5. 修改MessageReceived方法,使用Cryptographer方法解密消息(红色粗体显示)
        private void MessageReceived(MessageEventArgs args)
        {
            string message = args.Message;
 
            // TODO: Decrypt message
            string plainText = Cryptographer.DecryptSymmetric(symmProvider, message);
 
            this.txtMessages.AppendText(
                args.Sender + " says: " + plainText + Environment.NewLine);
        }
 
修改应用程序配置文件
1. 对应用程序添加app.config配置文件,并使用Enterprise Library 配置工具打开app.config配置文件,添加Cryptography Application Block配置项,如下图所示。
 
 
2. 选择 Cryptography Application Block | Symmetric Providers 节点,接着点击New | Symmetric Algorithm Provider 菜单项,如下图所示。
 

 
随即弹出Type Selector 对话框,如下图所示。选择 RijndaelManaged类型,点击 OK 按钮。
 
 
如果加密算法被破解或者易于受到攻击,则加密算法没有安全性。如果定制的算法没有经过测试验证,一般不太安全。因此,我们选择经过已公开的、众所周知的、且经受住多年攻击的加密算法。
 
随着计算能力的提高,推荐的密钥长度也发生变化。目前,加密密钥长度在128位到256位认为是安全的。大多数现代的算法使用至少128位长的密钥。
 
对称加密算法-AES,也称为Rijndael,推荐使用。该算法支持的密钥长度为128、192、和256位。DES算法不推荐使用。
 
3. 在Cryptographic Key 向导对话框中,选择Create a new key 选项,然后点击Next按钮,如下图所示。
 
 
该向导将引导创建和保护加密密钥。点击Generate 按钮创建一个新的密钥,然后点击Next 按钮,如下图所示。
 
 
在下一步保存加密文件的对话框中,将文件保存在本地的任何一个地方(你可以考虑保存在桌面),然后点击Next按钮,如下图所示。
 
 
 
在向导的最后一步,选择User mode 或者 Machine mode模式,点击Finish 按钮,如下图所示。
 

 
在创建密钥时,你可选择Machine mode 或者 User mode。
Machine mode一般在如下情况下使用:
(1)你的应用程序运行在自己的特定服务器上,且没有其他的应用程序。
(2)你有多个应用程序运行在相同的服务器上,你希望这些应用程序能够共享敏感信息。
User mode则一般在如下情况下采用:
在共享的环境运行应用程序,但确保Server上其他应用程序不能访问该应用程序的敏感信息。在这种情况下,每个应用程序都在隔离的环境下运行,且应用程序的资源,如文件和数据库等等,都限制只有应用程序自身才可以访问。
 
4. 选择Cryptography Application Block | Symmetric Providers | RijndaelManaged 节点,设置如下属性: Name = ChatProvider
ChatProvider是对称加密提供者的名称,在前面的代码中有使用到。
 
最后,记得要保存好配置文件。
 
运行应用程序
在Toby和Sam之间传递消息,在Console窗口发现消息已经加密了,但是在接收端,正确解密出明文信息。
 

 
你或许会注意到在使用Cryptographer之后,应用程序会有些不稳定(如发生空白消息)。通常,我们需要在加密或解密字符串之前,需要添加一些代码进行检查。如,在SendMessage和MessageReceived方法中,检查字符串的长度是否为0。在MessageReceived方法,对解密的字符串,还需要检查长度是否为4个字节的整数倍,且仅含有有效Base64字符。这里为了简便,忽略了这些。
 
添加错误处理
处理异常最好的办法是确保在最前面的地方添加检查代码,确保异常不要发生。首先,确保不要加密0长度的字符串。在项目Chat.cs文件中的SendMessage方法,添加如下代码。
        private void SendMessage(string message)
        {
            if ((message != null) && (message.Trim().Length > 0))
            {
                // TODO: Encrypt message
                string encrypted = Cryptographer.EncryptSymmetric(symmProvider, message);
 
                // Fire SendingMessage Event
                if (this.SendingMessage != null)
                    this.SendingMessage(new MessageEventArgs(this._name, encrypted));
            }
        }
 
http://www.entlib.com专业ASP.NET电子商务平台小组,欢迎你继续访问Cryptography  Application Block学习手册。
 
参考文档:
Cryptography Application Block Hands-On Labs for Enterprise Library
 

 

posted @ 2009年10月11日 0:29 | entlibforum 阅读 (1378) | 评论 (0)

Enterprise Library - Caching Application Block 学习手册(最新版) Part 3

Enterprise Library - Caching Application Block 学习手册(最新版) Part 3
 
本文演示如何在不同的应用程序中使用Enterprise Library - Caching Application Block模块,下面介绍了使用后台线程来装载缓存。
本文由http://blog.entlib.com 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供,欢迎交流。
 
练习三:实现后台异步缓存
首先打开ex03\begin 目录下的EmployeeBrowser.sln 项目文件。
 
实现数据库服务器在线时,后台线程预先装载缓存
1. 打开项目中的EmployeeService.cs代码文件,添加如下2个方法,用来在后台装载缓存。
        private static void PopulateCache()
        {
            byte[] photoData = null;
 
            EmployeesDataSet dsEmployees = GetContactDetails();
 
            if (dsEmployees == null)
                return;
 
            ICacheManager cache = CacheFactory.GetCacheManager();
 
            foreach (EmployeesDataSet.EmployeesRow employee in dsEmployees.Employees)
            {
                if (!cache.Contains(employee.EmployeeID.ToString()))
                {
                    EmployeeDataProvider dataProvider = new EmployeeDataProvider();
                    photoData = dataProvider.GetEmployeePhotoData(employee.EmployeeID);
                    cache.Add(employee.EmployeeID.ToString(), photoData);
                }
            }
        }
 
        private delegate void PopulateCacheDelegate();
 
        public static void BeginBackgroundLoad()
        {
            if (!ConnectionManager.IsOnline)
                return;
 
            PopulateCacheDelegate mi = new PopulateCacheDelegate(PopulateCache);
            mi.BeginInvoke(null, null);
        }
BeginBackgroundLoad 方法使用delegate在后台线程启动PopulateCache方法。PopulateCache方法遍历所有的员工,并缓存对应的图片(注:这不是很安全,因为用户可能在另一个线程中添加或删除记录)。更好的办法是,选取部分记录,然后进行遍历并缓存。
Caching Application Block在使用缓存时,确保线程安全,因此同时从多个线程访问时,是安全的。
 
2. 打开MainForm.cs代码文件,找到MainForm_Load方法,添加启动后台线程工作的代码。
        private void MainForm_Load(object sender, EventArgs e)
        {
            this.ToolStripLabel1.Text = ConnectionManager.StatusText;
 
            // Load data into the 'EmployeesDataSet'.
            EmployeesDataSet tempDataset = EmployeeService.GetContactDetails();
 
            if (tempDataset != null)
                this.EmployeesDataSet.Merge(tempDataset);
 
            EmployeeService.BeginBackgroundLoad();
        }
 
运行范例程序
1. 运行范例程序,现在不需要浏览任何员工,但需要等待约10秒,然后退出应用程序。
在应用程序在线时,后台线程将缓存员工图片。缓存保存在独立的存储区域,但是使用和上一节不同的PartitionName(partitionName="EmployeeBrowser_ex03"),这样缓存内容不会相互干扰。
 
 
2. 打开ConnectionManager.cs代码文件,修改IsOnline属性,模拟应用程序处于离线状态。
        static public bool IsOnline
        {
            get { return false; }
        }
 
3. 再次运行范例程序,现在应用程序处于离线状态,不能访问数据库,但是所有员工的联系信息和图片都已经缓存了,因此可以顺利浏览所有员工信息。
 
 
http://www.entlib.com专业ASP.NET电子商务平台小组,欢迎你继续访问Caching Application Block学习手册。
 
参考文档:
Caching Application Block Hands-On Labs for Enterprise Library
 

 

posted @ 2009年9月30日 22:52 | entlibforum 阅读 (1292) | 评论 (0)

Enterprise Library - Caching Application Block 学习手册(最新版) Part 2

Enterprise Library - Caching Application Block 学习手册(最新版) Part 2
 
本文演示如何在不同的应用程序中使用Enterprise Library - Caching Application Block模块,下面介绍了使用持久化后台存储(缓存)和离线缓存过期策略。
本文由http://blog.entlib.com 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供,欢迎交流。
 
练习二:持久化缓存
首先打开ex02\begin 目录下的EmployeeBrowser.sln 项目文件。
 
实现离线缓存
1. 打开项目中的EmployeeService.cs代码文件,添加如下命名空间的引用:
using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
 
2. 找到代码中的GetContactDetails方法,添加如下代码:
        public static EmployeesDataSet GetContactDetails()
        {
            EmployeesDataSet dsEmployees = null;
 
            // Attempt to retrieve from cache
            ICacheManager cache = CacheFactory.GetCacheManager();
            dsEmployees = (EmployeesDataSet)cache[CACHE_KEY];
 
            // Retrieve from dataProvider if not in Cache and Online
            if (dsEmployees == null && ConnectionManager.IsOnline)
            {
               EmployeeDataProvider dataProvider = new EmployeeDataProvider();
                dsEmployees = dataProvider.GetEmployees();
 
                // Expire in 2 days
                AbsoluteTime expiry = new AbsoluteTime(new TimeSpan(2, 0, 0, 0));
                cache.Add(CACHE_KEY, dsEmployees,
                    CacheItemPriority.High, null,
                    new ICacheItemExpiration[] { expiry });
            }
 
            return dsEmployees;
        }
上述代码实现在应用程序在线的时候,连接数据库。返回的数据集对象将添加到缓存中,并充分利用重载的Add方法,指定缓存的优先级和缓存过期策略。在这种情况下,用户保留在本地机器上的员工数据将不能超过2天,可以减少员工将这些信息泄露给其他公司的可能性,因为如果缓存过期将删除这些数据。
 
3. 修改GetemployeePhoto方法,在应用程序离线的情况下,不要连接数据库检索员工信息。
        public static Bitmap GetEmployeePhoto(Guid employeeId)
        {
            byte[] photoData = null;
 
            // Attempt to retrieve from cache
            ICacheManager cache = CacheFactory.GetCacheManager();
            photoData = (byte[])cache[employeeId.ToString()];
 
            // TODO: Retrieve from dataProvider if not in Cache and Online
            if (photoData == null && ConnectionManager.IsOnline)
            {
                EmployeeDataProvider dataProvider = new EmployeeDataProvider();
                photoData = dataProvider.GetEmployeePhotoData(employeeId);
 
                cache.Add(employeeId.ToString(), photoData);
            }
 
            // No data found.
            if (photoData == null)
                return null;
 
            // Convert bytes to Bitmap
            using (MemoryStream ms = new MemoryStream(photoData))
            {
                return new Bitmap(ms);
            }
        }
 
配置持久化缓存
1. 使用Enterprise Library 的配置管理工具,打开app.config配置文件。
2. 选择Caching Application Block | Cache Managers | Cache Manager 节点,然后选择 New | Isolated Storage 菜单项。
 
 
3. 选择Isolated Storage节点,设置PartitionName属性为 EmployeeBrowser。
Partition Name允许多个缓存使用Isolated storage,相互之间不造成干扰。保存上述配置文件。
 
运行范例程序
1. 浏览部分员工,这里会缓存员工图片信息,但是不要浏览所有员工信息,没有浏览的员工,其图片则没有缓存(方便下一步进行对比),然后关闭应用程序。
 
2. 打开项目中的ConnectionManager.cs代码文件,修改IsOnline属性,如下所示,模拟应用程序处于离线状态。
        static public bool IsOnline
        {
            get { return false; }
        }  
正常情况下,该类负责检测服务器的连接状态,判断是否Client处于在线状态,并连接数据库。
 
3. 再次运行范例程序,应用程序处于离线状态,不能访问数据库。现在需要从缓存中获取员工联系信息,包括员工图片,但是缓存中仅仅只有前面在线浏览过的员工图片信息,对于没有浏览过的员工信息,将仅仅显示员工信息,员工图片信息则无法显示,如下图所示。
 
 
 
http://www.entlib.com专业ASP.NET电子商务平台小组,欢迎你继续访问Caching Application Block学习手册。
 
参考文档:
Caching Application Block Hands-On Labs for Enterprise Library
 

 

posted @ 2009年9月29日 20:33 | entlibforum 阅读 (1272) | 评论 (0)

Enterprise Library - Caching Application Block 学习手册(最新版) Part 1

Enterprise Library - Caching Application Block 学习手册(最新版) Part 1
 
本文演示如何在不同的应用程序中使用Enterprise Library - Caching Application Block模块,需要SQL Server数据库。其中包含如下三个示例:
(1)使用Caching Block提供程序性能
(2)持久化Caching
(3)实现后台Caching
通过本文的学习,你可以学会在应用程序中应用Caching机制,同时掌握在后台填充缓存。
本文由http://blog.entlib.com 开源ASP.NET博客平台小组根据EntLib HOL手册编译提供,欢迎交流。
 
练习一:使用Caching Block提高应用程序性能
范例程序演示通过caching 来加快员工数据的现实,并持久化缓存,支持offline。
 
打开ex01\begin 文件夹下的EmployeeBrowser.sln文件。然后,在SQL Server Management Studio界面打开 \Enterprise Library 4.1 HOL\CS\Caching\setup 目录下的CachingHOL.sql文件,执行里面的SQL脚本。该脚本在EntLibQuickStarts数据库中创建Employees表,并初始化部分数据。
 
范例应用程序概述
本范例程序用来展示存储在数据库中的员工信息,包括显示员工的图片。尽管应用程序在启动的时候,装载所有的员工记录,但是并不装载所有的图片信息,而是在显示特定员工信息时,才装载对应的图片。这是因为图片数据量比较大,如果在启动应用程序时,装载所有的图片数据,会严重影响启动速度。
 
检查MainForm.cs文件中的MainForm_Load 方法,该方法调用EmployeeService类,EmployeeService又调用EmployeeDataPrvoider类来获取员工数据,如下图所示。
 
 
当前,EmployeeService仅仅直接依赖EmployeeDataProvider类,下面将强化利用Caching Block,在应用程序离线的情况下,也可以运行正常。
 
选择EmployeeDataProvider.cs文件,在代码文件中找到GetEmployeePhotoData方法,GetEmployeePhotoData方法中特别添加了1秒的延迟,用来模拟访问数据的延迟。
// HACK: Emulate a slow connection to the database.
Thread.Sleep(1000);
 
现在运行范例程序,发现在浏览照片时,非常缓慢,即使你之前已经浏览过相应的照片。
 
 
 
在EmployeeService类实现缓存
1. 选择EmployeeBrowser项目,添加对如下程序集的引用。
Microsoft.Practices.EnterpriseLibrary.Caching.dll
 
2. 打开EmployeeService.cs文件,在代码中添加对Caching命名空间的引用。
using Microsoft.Practices.EnterpriseLibrary.Caching;
 
3. 对GetEmployeePhoto方法添加如下代码。
        public static Bitmap GetEmployeePhoto(Guid employeeId)
        {
            byte[] photoData = null;
 
            // Attempt to retrieve from cache
            ICacheManager cache = CacheFactory.GetCacheManager();
            photoData = (byte[])cache[employeeId.ToString()];
 
            // Retrieve from dataProvider if not in Cache
            if (photoData == null)
            {
                EmployeeDataProvider dataProvider = new EmployeeDataProvider();
                photoData = dataProvider.GetEmployeePhotoData(employeeId);
                cache.Add(employeeId.ToString(), photoData);
            }
 
            // No data found.
            if (photoData == null)
                return null;
 
            // Convert bytes to Bitmap
            using (MemoryStream ms = new MemoryStream(photoData))
            {
                return new Bitmap(ms);
            }
        }
仔细对比代码,仅仅新增了caching相关的代码机制。上述方法使用了工厂模式(Factory Pattern),和其他的Enterprise Library 的Application Block一样,创建一个新的CacheManager实例。缓存Cache可以完全在内存中,或者依托在物理存储空间,这由配置来决定。
 
4. 添加如下的代码到ClearCache方法中,允许窗体请求服务获取新的数据。
        public static void ClearCache()
        {
            ICacheManager cache = CacheFactory.GetCacheManager();
            cache.Flush();
        }
上述方法将从Cache中删除所有数据。
 
应用程序配置文件
1. 使用Enterprise Library的配置文件编辑工具,打开应用程序中app.config配置文件,添加新的Caching Application Block配置,如下图所示。
 
 
2. 选择Caching Application Block | Cache Managers | Cache Manager 节点,在属性窗口中,可以看到一些可调整的属性设置,用来调整缓存的性能。这里保留这些设置不变,如下图所示。
 
 
保存配置文件,现在配置文件中包含有缓存配置设置。可以注意到后台存储设置为Null Storage,也就是,缓存信息将保留在内存中。
 
现在运行范例程序,发现浏览员工信息的性能将发生很大变化。在第一次浏览员工信息时,因为需要从数据库中检索图片信息,因此比较缓慢,但再次访问相同员工的信息时,因为缓存中已经有数据,直接从缓存中获取信息,性能有显著改善。
 
http://www.entlib.com专业ASP.NET电子商务平台小组,欢迎你继续访问Caching Application Block学习手册。
 
参考文档:
Caching Application Block Hands-On Labs for Enterprise Library
 

 

posted @ 2009年9月27日 23:15 | entlibforum 阅读 (1666) | 评论 (1)
«三月»
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910