我们有基于ASP.net的SqlMembershipProvider用户的Azure的SQL数据库上的数据库。 已变得显然的是,开箱的SqlMembershipProvider 4.0的不具有用于天青SQL连接所需的重试逻辑,其可滤除由于节流或可能会过期。
它可以实现我们具有此功能自己的成员提供,但它必须是完全一样的数据库交互作为标准的SqlMembershipProvider 4.0,以便在我们的数据库中的现有用户的工作。 然而对于这需要寻找到原来的SqlMembershipProvider 4.0的来源,该代码还没有被释放到开放以来2.0版本,所以我的问题是:
什么是最努力的方式来获得重试逻辑进入SqlMembershipProvider的? 而且还是那样地反映了SqlMembershipProvider的4.0 System.web.security.sqlMembershipProvider代码,并创建具有相同的功能的SqlMembershipProvider的,但使用重试逻辑的自定义的MembershipProvider如微软TransientFaultHandling ReliableSqlConnection的? 难道是合法的,做给微软的asp.net库例如许可证这样的事情(反映和创造类似的代码,但与附加功能)。 的System.Web?
我想今天最好的解决办法是从System.Web.Providers(可用提供商继承ASP.NET通用供应商组装),只需注入重试政策,每个公共方法:
public class MyDefaultProfileProvider : System.Web.Providers.DefaultProfileProvider
{
private RetryPolicy retryPolicy;
public MyDefaultProfileProvider()
{
var retryStrategy = new Incremental(5, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
this.retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(retryStrategy);
retryPolicy.Retrying += retryPolicy_Retrying;
}
private void retryPolicy_Retrying(object sender, RetryingEventArgs e)
{
// Log, whatever...
}
public override System.Web.Profile.ProfileInfoCollection GetAllProfiles(System.Web.Profile.ProfileAuthenticationOption authenticationOption, int pageIndex, int pageSize, out int totalRecords)
{
int tempTotalRecords = 0;
var profiles = retryPolicy.ExecuteAction(() =>
{
return base.GetAllProfiles(authenticationOption, pageIndex, pageSize, out tempTotalRecords);
});
totalRecords = tempTotalRecords;
return profiles;
}
...
}
要知道,如果它是合法重用代码,你应该看看许可证 。