我最近收到的一些错误报告似乎表明,有时User.Identity.Name为NULL
或与应有的不同(经过身份验证的用户的用户名),即使页面已通过身份验证:
[Authorize]
[HttpGet]
public ActionResult MyAction()
{
string username = User.Identity.Name;
Member member = memberRepository.GetMemberByUserName(username);
member.something // fails with a null reference exception
}
GetMemberByUserName()
方法使用Linq to SQL来检索成员。
public Member GetMemberByUsername(string username)
{
if (String.IsNullOrEmpty(username))
return null;
return db.Members.SingleOrDefault(d => d.username.Equals(username));
}
在哪种情况下会发生这种情况?每当我使用它时,是否需要检查User.Identity.Name是否为NULL
?
当然,User.Identity.Name可能是一个红色的鲱鱼,可能是数据库没有返回任何东西。如果是这样的话,我可能会预料会抛出异常。
修改 这是一个间歇性的问题 - 可能是经过身份验证的用户刷新一次,User.Identity.Name是正确的并且检索到成员,然后在第二次刷新时,不会检索该成员。
答案 0 :(得分:2)
怎么样:
public Member GetMemberByUsername(string username)
{
if (String.IsNullOrEmpty(username))
return null;
return db.Members.SingleOrDefault(d => d.username.Equals(username));
}
答案 1 :(得分:2)
可能是数据库没有返回任何内容。如果是这样的话,我可能会预料会抛出异常。
不,它不会。如果存在多条记录,则SingleOrDefault
将返回单条记录,无记录或抛出异常。
Single
将返回单个记录,或如果没有记录或多个记录则抛出异常。
可能是一些事情。也许您对String.Equals
感到区分大小写。
Request.IsAuthenticated
([Authorize]
所看到的)仍然可能是真的,但没有身份。特别适用于自定义身份验证系统(例如尝试解密表单身份验证票证),而您尚未指定使用的内容。
此外,请确保Username
字段由唯一索引支持,以提供服务器端保证SingleOrDefault
永远不会抛出异常。
我会在你的控制器动作中加入一些try / catch,并设置ELMAH以捕获异常。