如何为Azure SQL添加ASP.NET Membership Provider的重试逻辑?

4
我们有一个基于Azure SQL数据库的ASP.net sqlMembershipProvider用户数据。显然,开箱即用的sqlMembershipProvider4.0并没有所需的重试逻辑,可以通过限流或到期导致连接中断。
我们可以实现自己的成员提供程序,具有此功能,但必须与标准的sqlMembershipProvider 4.0完全相同。为了使用我们数据库中的现有用户,但是这需要查看原始sqlMembershipProvider 4.0的源代码,自从2.0版本以来,该代码就没有公开发布过,因此我的问题是:
如何以最小的努力获得sqlMembershipProvider的重试逻辑?或者是否应该反射System.web.security.sqlMembershipProvider中的sqlMembershipProvider 4.0代码,并创建一个自定义membershipProvider,它具有与sqlMembershipProvider相同的功能,但使用Microsoft的TransientFaultHandling ReliableSqlConnection等重试逻辑?做这样的事情是否合法(反射和创建类似但具有附加功能的代码),考虑到Microsoft针对asp.net库(例如System.Web)的许可证?
1个回答

3

我认为今天最好的解决方案是从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;
    }

    ...
}

要知道是否可以重复使用代码,您应该查看许可证


这是一个好主意,但有一件事,这个方案是否不适用于旧的SQLProfileProvider或者说是来自.NET 4.0的sqlMembershipProvider?另外一个Stack Overflow的问题链接提到了模式是不同的,这意味着转换现有成员资料数据需要额外操作。 - Finn Krewer
这篇文章解释了为什么普通提供程序与SQL Azure不兼容的原因:http://support.microsoft.com/kb/2006191。此外,您还应该查看Troy的博客,他还谈到了新的安全功能和新提供程序中简化的架构:http://www.troyhunt.com/2012/07/stronger-password-hashing-in-net-with.html。由于密码哈希不同,我想知道是否可能将现有数据迁移到新提供程序。 - Sandrino Di Mattia
请查看“用于 SQL Azure 的更新 ASP.NET 脚本”(http://archive.msdn.microsoft.com/KB2006191)。这应该可以正确地与经典的 SqlMembershipProvider 类一起使用。 - Sandrino Di Mattia
我确实看到了新提供商的优势,也会尝试切换到它们。但是我在4.0版本的Azure SQL中已经有很多用户了,除了重试之外,它还可以工作(去年我使用了你指出的脚本)。所以我继续在旧的Profile、Membership和Role Provider上实施了你的方法,效果非常好,在良好的负载下进行了测试和测试。谢谢! - Finn Krewer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接