ASP.NET Application Providers相信大家都已经非常熟悉,它为我们开发ASP.NET应用程序提供了方便。
比如在Visual Studio控件工具箱中的Login部分,就是基于Membership provider、Session provider和Profile provider,大大地简化了我们在开发过程中处理与用户相关的功能。
(更多Provider的信息请查看http://msdn.microsoft.com/en-us/library/aa479030.aspx)
ASP.NET Provider架构示意图
ASP.NET Provider的类结构图
Azure Provider是什么
Azure上的应用程序也是ASP.NET 应用程序,所以它也支持ASP.NET 的Provider模型。不同的是,我们平时用的Provider是基于关系数据库的(如SQL Server),而“云端”上Provider自然也需要使用“云端”的数据解决方案——Windows Azure Storage。
云平台是基于分布式计算的。这就意味着,你的同一个应用程序可能会分布在不同的机器上。所以包括Session在内的各种用户数据不能放在host主机上,必须通过Windows Azure Storage来统一管理。
微软认为:基于Windows Azure Storage的provider 比传统SQL provider具有以下优势:
在保持与SQL provider完全相同的使用方法(不用做任何代码修改)的基础上,
Azure Provider的原理
在Windows Azure SDK(March 2009 CTP)中,微软已经提供了可直接使用的Azure版ASP.NET Provider。包括membership, role, profile, session state 4种providers。
打开Azure版ASP.NET Provider项目,非常一目了然。以下的4个文件与4种provider一一对应。
拿TableStorageMembershipProvider来说,它其实是继承了MembershipProvider类(参照上文的provider类结构图),override了MembershipProvider类里与数据操作相关的方法,将它们换成使用Windows Azure Table Storage版本的。
public class TableStorageMembershipProvider : MembershipProvider
配置使用Azure Provider:
刚才说了,从传统的SQL Provder转换到使用Azure Provider,不用做任何代码上的改动,只需要更改配置文件就可以了。
下面是MemshipProvider的配置示例。(其他Provider也类似,请参考附件中的代码)
代码下载:
使用Azure Provider的示例代码:AspProvidersDemo.rar
Azure Provider源代码:AspProviders.rar
StorageClient:StorageClient.rar
______________________分割线____________________________________________________
Azure Provider的数据层面:
Provider |
Storage |
Membership |
Table storage |
Profile |
Table storage for storing management data Blob storage for storing the actual profile data |
Session state |
Table storage for storing management data Blob storage for storing the actual session state |
Role provider |
Table storage |
Column |
Type |
Comment |
Partition key |
String |
Concatenation of application name and user name |
Row key |
String |
Unused, empty string |
User name |
String |
|
User id |
Guid |
|
Password |
String |
Max 128 characters because of encode limitations |
Password format |
String |
.NET regular expression |
Password salt |
String |
|
|
String |
|
Password question |
String |
|
Password answer |
String |
|
IsApproved |
Bool |
|
IsAnonymous |
Bool |
|
IsLockedOut |
Bool |
|
CreateDate |
DateTime |
In UTC |
LastLoginDate |
DateTime |
In UTC |
LastPasswordChangeDate |
DateTime |
In UTC |
LastLockoutDate |
DateTime |
In UTC |
LastActivityDate |
DateTime |
In UTC |
FailedPasswordAttemptCount |
Int |
|
FailedPasswordAttemptWindowStart |
DateTime |
In UTC |
FailedPasswordAnswerAttemptCount |
Int |
|
FailedPasswordAnswerAttemptWindowStart |
DateTime |
In UTC |
Comment |
String |
|
ProfileLastUpdated |
DateTime |
In UTC |
ProfileBlobName |
String |
Blob where profile data is stored |
ProfileIsCreatedByProfileProvider |
Bool |
|
ProfileSize |
Int |
Size of profile data; saved to save roundtrips |
Column |
Type |
Comment |
Partition key |
String |
Concatenation of application name and user name |
Row key |
String |
Role name |
Application name |
String |
|
User name |
String |
|
Role name |
String |
|
Column |
Type |
Comment |
Partition key |
String |
Application name + Session id |
Row key |
String |
Not used, empty string |
Id |
String |
|
Application name |
String |
|
Blob name |
String |
References session blob |
Timeout |
DateTime |
|
Expires |
DateTime |
In Utc |
Created |
DateTime |
In Utc |
Lock date |
DateTime |
In Utc |
Locked |
Bool |
|
Lock |
Int |
|
Initialized |
bool |
|