У меня проблема с Lazy<T>
, и я не могу решить, в чем проблема.Lazy <T> действительно ленив
Я возвращаю содержимое файла cookie, но если я использую Lazy<T>
, требуется пройти 2 проверки подлинности пользователя. У меня есть простой код, который работает в первый раз, но, как я уже сказал, я не могу понять, почему метод Lazy<T>
не работает должным образом.
Вот 2 фрагмента - ничто другое не отличается.
Отрывок 1 - работает правильно
public FormsAuthenticationTicket Ticket
{
get
{
var ck = Helper.Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (ck != null)
{
return FormsAuthentication.Decrypt(ck.Value);
}
return null;
}
}
Отрывок 2 - потребность 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;
}
}
Я перенаправляю пользователя, если они вошли в систему на основе информации о пользователе:
Использование ленивого кода, я должен войти в систему дважды, чтобы увидеть результат, первый снипп работает в первый раз.
так, что не так? Snippet не вызывает «GetCookie», поэтому они не совпадают. – Jodrell
IsNotNull - это не метод ленивых. Пожалуйста, покажите этот метод расширения. –
@ScottChamberlain Это называется 'HttpCookie', а не' Lazy '. Хотя это также не определяет метод IsNotNull. –
juharr