asp.net - 如何向 Azure SQL 的 ASP.NET 成员资格提供程序添加重试逻辑?

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

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

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

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

最佳答案

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

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 .

关于asp.net - 如何向 Azure SQL 的 ASP.NET 成员资格提供程序添加重试逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12027383/

相关文章:

Azure 模拟器 - 无法加载文件或程序集

azure - 如何通过管理 API 获取 Azure 网站的 FTP URL?

c# - 为什么 Azure SignalR 不发送 Azure Functions 发布的消息?

asp.net - 如何在我的域模型中实现 ASP.NET 成员资格提供程序

c# - 重写 System.Web.Security.Roles 函数?

c# - 在 ASP.NET C# 中解析 json 文件

c# - 检查属性的嵌套/层次结构是否为空?

c# - 将参数发送到另一个 ASP.Net 页面

asp.net - 对字符进行编码

asp.net - Membership.FindUsersByEmail - SQL 通配符