我遇到Lazy<T>
的问题,我无法解决问题所在。
我正在返回Cookie的内容,但如果我使用Lazy<T>
,则需要2次验证用户身份。我有一些简单的代码可以在第一时间运行,但正如我所说,我无法弄清楚为什么Lazy<T>
方法没有按预期工作。
这里有2个片段 - 没有别的不同。
Snippet 1 - 正常工作
public FormsAuthenticationTicket Ticket
{
get
{
var ck = Helper.Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (ck != null)
{
return FormsAuthentication.Decrypt(ck.Value);
}
return null;
}
}
小部件2 - 需要按两下按钮
Lazy<HttpCookie> lazyCookie = new Lazy<HttpCookie>(GetCookie);
public FormsAuthenticationTicket Ticket
{
get
{
if (Cookie != null && !string.IsNullOrEmpty(Cookie.Value))
{
return FormsAuthentication.Decrypt(Cookie.Value);
}
return null;
}
}
HttpCookie Cookie
{
get { return lazyCookie.Value; }
}
static HttpCookie GetCookie()
{
return Helper.Context.Request.Cookies[FormsAuthentication.FormsCookieName];
}
从httpmodule ::
以完全相同的方式调用这两段代码 public void Init(HttpApplication context)
{
context.PostAuthenticateRequest += PostAuthenticateRequest;
}
void PostAuthenticateRequest(object sender, EventArgs e)
{
var page = Helper.Context.Handler as Page;
if (page != null)
{
StoreUserDetails();
}
}
void StoreUserDetails()
{
var ticket = new FormsAuthCookie().Ticket;
if (ticket != null)
{
var identity = new UserIdentity(ticket);
var roles = Roles.GetRolesForUser(identity.Name);
var principle = new GenericPrincipal(identity, roles);
Helper.Context.Current.User = principle;
}
}
如果用户根据主要用户信息登录,我会重定向用户:
if(User.IsInRole("SuperAdmin"))
Response.RedirectToRoute("PageAdmin");
使用Lazy代码,我必须登录两次以查看结果,第一个代码段首次使用。
答案 0 :(得分:0)
代码,
public FormsAuthenticationTicket Ticket
{
get
{
return new Lazy<FormsAuthenticationTicket>(() =>
{
var ck =
Helper.Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (ck != null)
{
return FormsAuthentication.Decrypt(ck.Value);
}
return null;
}).Value;
}
}
与您的代码段1代码相同的直接Lazy
。