我已经玩了好几年的各种版本了: 1)membershipprovider是否处理SQL Azure(或者其他任何存储提供程序(表,blob等))的瞬时连接故障? 2)为什么过去存在的存储过程消失了?我更喜欢SP应该是显而易见的原因。
答案 0 :(得分: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
答案 1 :(得分:0)
事实证明,除了SP问题,DefaultMembershipProvider不支持瞬态故障处理,但有一种方法......
问题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;
}