懒惰<t>真的很懒惰

时间:2016-02-16 16:51:47

标签: c#

我遇到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代码,我必须登录两次以查看结果,第一个代码段首次使用。

1 个答案:

答案 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