2013-08-29 41 views

回答

0

原來,除了SP的問題,DefaultMembershipProvider不支持瞬態故障處理,但有一個辦法...

SO質疑here

了答案:創建一個新的供應商,從默認的提供商繼承,設置爲默認的供應商,你去那裏:

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out System.Web.Security.MembershipCreateStatus status) 
    { 
     MembershipCreateStatus tempstatus = 0; 
     var something = retryPolicy.ExecuteAction(() => 
     { 
      return base.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out tempstatus); 
     }); 
     status = tempstatus; 
     return something; 
    } 
0

我可以告訴你關於SP的信息。 DefaultMembershipProvider似乎現在使用EF(或者可能是ADO.Net)。這是我在System.Web.Providers.DefaultMembershipProvider

internal static IQueryable<DbDataRecord> GetAllMembershipUsersLikeUserName(MembershipEntities ctx, string applicationName, string userName, int pageIndex = -1, int pageSize = -1) 
{ 
    string queryString = QueryHelper.AppendUserNameSkipLimitIfNeeded("select u.UserName, u.UserId, m.Email, m.PasswordQuestion, m.Comment, m.IsApproved, m.IsLockedOut, m.CreateDate, m.LastLoginDate, u.LastActivityDate, m.LastPasswordChangedDate, m.LastLockoutDate FROM Users as u, Memberships as m, Applications as a WHERE ToLower(a.ApplicationName) = @appName AND a.ApplicationId = m.ApplicationId AND m.UserId = u.UserId AND ToLower(u.UserName) LIKE @userName", pageIndex, pageSize); 
    return (IQueryable<DbDataRecord>) ctx.CreateQuery<DbDataRecord>(queryString, new ObjectParameter("appName", (object) applicationName.ToLowerInvariant()), new ObjectParameter("userName", (object) userName.ToLowerInvariant())); 
} 

隨着標準的CRUD查詢發現,我沒有看到你使用SP的點,因爲將在性能上沒有太大的不同,即使有的話。

我在這裏講的是通用供應商,一些細節here

+0

我對SP的興趣有兩個:限制SQL用戶通過授予執行權限等來做些什麼,並通過參數化避免SQL注入。結果發現兩者都是在提供者內部處理的,我相信瞬態故障處理也是如此。 –