2011-04-21 177 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