为什么我从Membership.GetCurrentUserName获取NullReferenceException?

时间:2009-03-19 16:50:18

标签: msbuild asp.net-membership nullreferenceexception

我刚刚切换到使用msbuild预编译我的网站,现在我收到了这个奇怪的错误:

我有一个对Membership.GetUser()的调用,它抛出:

[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.Security.Membership.GetCurrentUserName() +36
System.Web.Security.Membership.GetUser() +7
...

1 个答案:

答案 0 :(得分:3)

Reflector显示Membership.GetCurrentUserName的实现是:

private static string GetCurrentUserName()
{
    if (HostingEnvironment.IsHosted)
    {
        HttpContext current = HttpContext.Current;
        if (current != null)
        {
            return current.User.Identity.Name;
        }
    }
    IPrincipal currentPrincipal = Thread.CurrentPrincipal;
    if ((currentPrincipal != null) && (currentPrincipal.Identity != null))
    {
        return currentPrincipal.Identity.Name;
    }
    return string.Empty;
}

乍一看,最可能的解释是:

  • HttpContext.Current不为null,

  • HttpContext.Current.User为null或具有null Identity属性。

所有其他路径似乎都有null测试。

所以我建议你跟踪HttpContext.User的类型和内容。

HttpContext.Current.User是一个IPrincipal,我知道的IPrincipal的大多数具体实现都不允许使用null标识,所以我打赌HttpContext.User为null。