如何将重试逻辑添加到Azure SQL的ASP.NET成员资格提供程序?

时间:2012-08-19 14:43:33

标签: asp.net azure asp.net-membership azure-sql-database membership-provider

我们在Azure SQL数据库上有一个基于ASP.net sqlMembershipProvider的用户数据库。很明显,开箱即用的sqlMembershipProvider 4.0没有Azure SQL连接所需的重试逻辑,这些逻辑可能由于限制而丢失或可能会过期。

可以实现我们自己的具有此功能的成员资格提供程序,但它必须与标准sqlMembershipProvider 4.0完全相同的数据库交互才能与数据库中的现有用户一起使用。但是,为此需要查看原始sqlMembershipProvider 4.0的源代码,此代码自2.0版本以来尚未发布到开放状态,所以我的问题是:

将重试逻辑放入sqlMembershipProvider的最省力的方法是什么?或者是否会在System.web.security.sqlMembershipProvider中反映sqlMembershipProvider 4.0的代码并创建一个自定义membershipProvider,它具有与sqlMembershipProvider相同的功能,但使用重试逻辑,例如Microsofts TransientFaultHandling ReliableSqlConnection?考虑到微软的asp.net库许可证,做这样的事情(反映和创建类似的代码但具有附加功能)是否合法?的System.Web?

1 个答案:

答案 0 :(得分:3)

我认为今天最好的解决方案是继承System.Web.Providers(ASP.NET Universal Providers程序集)中提供的提供程序,并简单地为每个公共方法注入重试策略:

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;
    }

    ...
}

要知道重用代码是否合法,您应该look at the license