2016-02-16 2 views
0

У меня проблема с 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; 
     } 
    } 

Я перенаправляю пользователя, если они вошли в систему на основе информации о пользователе:

Использование ленивого кода, я должен войти в систему дважды, чтобы увидеть результат, первый снипп работает в первый раз.

+2

так, что не так? Snippet не вызывает «GetCookie», поэтому они не совпадают. – Jodrell

+1

IsNotNull - это не метод ленивых . Пожалуйста, покажите этот метод расширения. –

+1

@ScottChamberlain Это называется 'HttpCookie', а не' Lazy '. Хотя это также не определяет метод IsNotNull. – juharr

ответ

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

Является прямым Lazy эквивалентом вашего Отрывок 1 кода.

+0

Я проверю его Jodrell –

+0

@JohnOhara, я знаю это Ответ на самом деле не очень полезен, но он обеспечит, что ваша проблема не связана с 'Lazy', но в другом месте. – Jodrell