4

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 のコードを反映し、sqlMembershipProvider と同じ機能を持ちながら、Microsoft の TransientFaultHandling ReliableSqlConnection などの再試行ロジックを使用するカスタム MembershipProvider を作成しますか? asp.netライブラリに対するMicrosoftのライセンスを考えると、そのようなことを行うことは合法でしょうか(同様のコードを反映して作成しますが、機能が追加されています)。System.Web?

4

1 に答える 1

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

    ...
}

コードを再利用することが合法かどうかを知るには、ライセンスを確認する必要があります

于 2012-08-19T15:09:13.070 に答える