Входная строка была не в правильном формате - PullRequest
1 голос
/ 21 апреля 2011

Я получаю это исключение (в заголовке) всякий раз, когда пытаюсь получить идентификатор пользователя из сеанса (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;
    }

Когда я впервые добавляю идентификатор в сеанс, он добавляется в виде строки. Я попытался использовать Convert.Int32 и Convert.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).

Ответы [ 6 ]

1 голос
/ 21 апреля 2011

Попытка использовать FormsAuthentication.SetAuthCookie () (http://msdn.microsoft.com/en-us/library/twk5762b.aspx) вместо того, чтобы посмотреть, работает ли это, вместо того, чтобы создавать cookie-файл самостоятельно.

Вы упомянули, что теперь это работает в вашем комментарии выше, но, боюсь, яЯ не уверен, почему, не видя больше контекста в вашем примере кода. Это может быть связано с параметрами, которые вы передаете конструктору FormsAuthenticationTicket (проверьте образец в http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.aspx - возможно, неверный параметр пути cookie форм)в вашем случае?). Попробуйте использовать FormsAuthentication.FormsCookiePath в качестве последнего параметра вместо «/», чтобы исключить эту возможность.

0 голосов
/ 21 апреля 2011

FormatException повышается на int.Parse, когда переданное ему string содержит действительное число.

0 голосов
/ 21 апреля 2011

Проблема в том, что строка, которую вы пытаетесь проанализировать, не является числом.См. Документацию по методу Parse () .

FormatException: s не состоит только из необязательного отрицательного знака, за которым следует последовательность цифр в диапазоне от 0 до 9.

Возможно, вы захотите использовать TryParse ()вместо.Таким образом, ошибка синтаксического анализа вернет ложь, а не создаст исключение.

Также имя действительно целое число или вы намеревались использовать другое поле, которое будет содержать целое число?

0 голосов
/ 21 апреля 2011

_httpContext.User.Identity.Name, вероятно, не может быть проанализировано как целое число в этом случае. Вам следует отладить или распечатать свойство Identity.Name, чтобы убедиться, что оно может быть оценено как целое число, или использовать int.TryParse () для оценки строки, чтобы избежать исключения (в зависимости от ваших требований).

0 голосов
/ 21 апреля 2011

Возможно, потому что httpContext.User.Identity.Name - это имя пользователя, а не идентификатор пользователя.

0 голосов
/ 21 апреля 2011

Вы получите это исключение, если строка, которую вы пытаетесь проанализировать с целым числом, не является допустимым целым числом. Например, если имя пользователя подключенного в данный момент пользователя - «john»:

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

вы получите это исключение.

...