2011-04-21 8 views
0

세션 (FormsAuthentication)에서 사용자 ID를 가져올 때마다 제목에서이 예외가 계속 발생합니다. 메소드의 코드는 다음과 같습니다.입력 문자열의 형식이 올바르지 않습니다.

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을 사용했지만 여전히 동일한 예외가 있습니다. 어떻게 그 일을 막을 수 있습니까?

업데이트 : 프로젝트를 디버깅 및 _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

UPDATE ... 여기에 뭔가를 놓친 거지 당신이 볼 수 있듯이 http://i52.tinypic.com/2cnaw00.jpg는 CurrentNotification 속성은 예외가 말한다 . 이것이 문제의 진정한 원인 일 수 있습니까?

P.S : Helper 클래스는 해당 생성자에서 HttpContext 인스턴스를 사용합니다. 이는 현재 컨텍스트 인 : x.For<HttpContext>().Use(HttpContext.Current); (StructureMap 사용)을 전달하는 방법입니다.

+3

_httpContext.User.Identity.Name은 실제로 정수입니까? 그것을 출력하고 어떻게 생겼는지보십시오. – alex

+0

@alex, 그렇게 생각합니다. 디버깅을 중지하고 디버거를 다시 실행하면 세션이 거기에있게되고 정상적으로 로그인하게됩니다. – Kassem

+0

@ 카센 : 아직도, 끈이 어떻게 보이는지 보셨습니까? 어쩌면 당신은 확실히 거기에 있으면 안되는 편지를 가지고있을 것입니다 ... – alex

답변

1

대신 쿠키를 직접 작성하는 대신 FormsAuthentication.SetAuthCookie() (http://msdn.microsoft.com/en-us/library/twk5762b.aspx)를 사용하여 작동하는지 확인하십시오.

당신은 지금 당신의 의견에서 위와 같이 언급했지만, 나는 당신의 코드 샘플에서 더 많은 문맥을 보지 않고서는 왜 확신이 서지 않습니다. FormsAuthenticationTicket 생성자에 전달하는 매개 변수와 관련이있을 수 있습니다 (예제를 http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.aspx에서 확인하십시오. 양식 쿠키 경로 매개 변수가 잘못된 경우 일 수 있습니다). "/"대신 FormsAuthentication.FormsCookiePath를 마지막 매개 변수로 사용하여이 가능성을 제거하십시오.

0

정수로 구문 분석하려는 문자열이 유효한 정수가 아닌 경우이 예외가 발생합니다. 예를 들어 현재 연결된 사용자의 사용자 이름이 "john"인 경우 :

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

이 예외가 발생합니다.

+0

나는 이해합니다. 그러나 왜 나는'_httpContext.User.Identity.Name'에서 빈 문자열을 얻는 지 알 수 없습니다. 모든 내용이 어떻게 통합되어 있는지 확인하려면 질문에 대한 업데이트를 확인하십시오. 그것을 엉망으로 만들고있는 뭔가가 있어야합니다 ... – Kassem

0

아마도 httpContext.User.Identity.Name은 사용자 ID가 아닌 사용자 이름이기 때문일 수 있습니다.

0

_httpContext.User.Identity.Name은이 경우 정수로 분석 할 수 없습니다. Identity.Name 속성을 디버깅하거나 출력하여 정수로 평가하거나 int.TryParse()를 사용하여 요구 사항에 따라 예외를 피하기 위해 문자열을 평가해야합니다.

0

문제는 구문 분석하려는 문자열이 숫자가 아닙니다. Parse() method의 설명서를 참조하십시오.

FormatException을 : s는 전적으로 0에서 9

에 이르기까지 자리 의 순서 다음에 선택적인 음의 부호 의 를 구성하지 않는 대신) TryParse를 (사용 할 수 있습니다. 그렇게하면 구문 분석에 실패하면 예외를 만드는 대신 false가 반환됩니다.

또한 실제로 이름이 정수입니까, 아니면 정수가 포함될 다른 필드를 사용하려고 했습니까?

0

string에 전달 된 은 유효한 번호가 포함되어있을 때 int.Parse에 의해 발생합니다.

관련 문제