2011-04-21 149 views
0

每当我尝试从会话(FormsAuthentication)获取用户标识时,我总是收到此异常(在标题中)。下面是该方法的代码:输入字符串格式不正确

public User GetUserFromSession() 
    { 
     int userId = int.Parse(_httpContext.User.Identity.Name); //this line throws the exception 
     IsNotNull(userId, "session user id"); 
     var user = _userService.GetUserById(userId); 
     return user; 
    } 

当我第一次将ID添加到会话中时,它将作为字符串添加。我尝试使用Convert.Int32Convert.Int16,但我仍然得到相同的例外。我怎么能阻止这种情况发生?

UPDATE:

好吧,我调试的项目和检查的_httpContext.User.Identity.Name的价值,它实际上是一个空字符串!我不明白为什么会发生这种情况...以下是我如何登录用户:

var authTicket = new FormsAuthenticationTicket(
    1, 
    user.Id.ToString(), //user id 
    DateTime.Now, 
    DateTime.Now.AddDays(30), // expiry 
    dto.RememberMe, //true to remember 
    "", //roles 
    "/" 
    ); 

//encrypt the ticket and add it to a cookie 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, 
          FormsAuthentication.Encrypt(authTicket)); 
Response.Cookies.Add(cookie); 

不应该这样做吗?还是我失去的东西在这里...

更新2:

看看这个截图:http://i52.tinypic.com/2cnaw00.jpg 正如你所看到的,CurrentNotification物业说,有一个例外。这可能是问题的真正根源吗?

P.S:Helper类在构造函数中接受一个HttpContext实例,这就是我传递当前上下文的方式:x.For<HttpContext>().Use(HttpContext.Current);(使用StructureMap)。

+3

_httpContext.User.Identity.Name是否是一个整数?尝试输出它,看看它的样子。我猜是的,@alex, – alex 2011-04-21 12:09:14

+0

。因为如果停止调试并再次运行调试器,会话将在那里,我将正常登录。 – Kassem 2011-04-21 12:14:23

+0

@Kassem:还有,你看过这个字符串是怎么看的?也许你有一封肯定不应该在那里的信... – alex 2011-04-21 12:16:31

回答

1

尝试使用FormsAuthentication.SetAuthCookie()(http://msdn.microsoft.com/zh-cn/library/twk5762b.aspx)来查看是否有效,而不是自己创建cookie。

你提到这个现在可以在你的评论上面找到,但是恐怕我不确定为什么没有在你的代码示例中看到更多的上下文。这可能与您传递给FormsAuthenticationTicket构造函数的参数有关(请检查http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.aspx处的示例 - 也许窗体cookie路径参数在您的情况下是错误的?)。尝试使用FormsAuthentication.FormsCookiePath作为最后一个参数,而不是“/”只是为了消除这种可能性。

0

如果您尝试解析为整数的字符串不是有效整数,则会得到此异常。例如,如果当前连接的用户的用户名是“john”:

int userId = int.Parse("john"); 

您将得到此例外。

+0

我明白。但我不知道为什么我要在'_httpContext.User.Identity.Name'中得到一个空字符串。请检查问题的更新,看看它们是如何融合在一起的。必须有一些让它变得糟糕的东西...... – Kassem 2011-04-21 12:49:01

0

可能是因为httpContext.User.Identity.Name是用户名,而不是用户ID。

0

在这种情况下,_httpContext.User.Identity.Name可能无法解析为整数。您应该调试或打印出Identity.Name属性以确保它可以作为整数计算,或者使用int.TryParse()计算字符串以避免发生异常(取决于您的要求)。

0

问题是您尝试解析的字符串不是数字。请参阅Parse() method上的文档。

出现FormatException:s不包括 只是随后的数字 范围从0到9

序列可选负号 的您可能需要使用的TryParse()来代替。这样解析失败将返回一个错误而不是创建一个异常。

也是名称真的是一个整数或你打算使用一些其他字段,将包含一个整数?

0

string传递给它包含有效数字时,FormatException被提出int.Parse