4

У меня есть статический класс с несколькими статическими методами. В этих методах я пытаюсь получить доступ к контексту текущего потока, используя HttpContext.Current. Например:HttpContext.Current NullReferenceException в статическом методе

var userName = HttpContext.Current.User.Identity.Name; 

Однако, когда я сделать это, я получаю NullReferenceException, печально известной «Ссылка на объект не указывает на экземпляр объекта.»

Любые идеи?

+1

Каковы статические методы? Где их зовут? – SLaks

ответ

5

Непонятно с оригинального сообщения, что HttpContext на самом деле отсутствует. Свойство HttpContext.User также может быть нулевым на определенных этапах жизненного цикла, что даст вам то же самое исключение. Все остальные вопросы в сторону, вам нужно пройти через источник и посмотреть, какая часть выражения на самом деле null.

При написании кода, который ссылается на статические методы/свойства, такие как HttpContext.Current, вы должны написать им, зная, что ваш код не будет запущен, когда методы/свойства действительно доступны. Обычно у вас есть что-то вроде этого:

static string GetCurrentUserName() 
{ 
    HttpContext context = HttpContext.Current; 
    if (context == null) 
     return null; 
    IPrincipal user = context.User; 
    if (user == null) 
     return null; 
    return user.Identity.Name; 
} 

Хотя я подозреваю, что это не реально решить вашу проблему здесь, было бы просто избавиться от исключения. Более вероятно, что вы вызываете этот метод за раз или в тот момент, когда контекст просто недоступен, например, в фоновом потоке, статическом конструкторе или инициализаторе поля или в методе Application_BeginRequest или в каком-то подобном месте.

Я мог бы начать с изменения статических методов на методы экземпляра класса, которые зависят от экземпляра HttpContext (т. Е. Взятого в конструкторе). Легко обмануть себя в мысли, что такие методы, как GetCurrentUserName, являются простыми «полезными» методами, но их действительно нет, и обычно недействительно вызывать метод, который ссылается на HttpContext.Current через статическое свойство из любого места, где вы не уже есть пример ссылка на тот же HttpContext (т. е. от класса Page). Разногласия, если вы начинаете переписывать свои классы, как это:

public class UserResolver 
{ 
    private HttpContext context; 

    public UserResolver(HttpContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 
     this.context = context; 
    } 

    public string GetUserName() 
    { 
     return (context.User != null) ? context.User.Identity.Name : null; 
    } 
} 

... то вы, вероятно, найти очень быстро, где цепь была нарушена, которая будет точка, в которой вы должны ссылаться HttpContext.Current, потому что вы не можете получить его нигде.

В этом конкретном случае, очевидно, вы можете решить проблему, просто взяв трассировку стека NullReferenceException, чтобы узнать, где/когда цепочка начинается, поэтому вам не нужно вносить изменения, описанные выше - Я просто рекомендую общий подход, который поможет уменьшить эти ошибки «пропавших без вести» в будущем.

+0

Это не здорово, но это то, что я и сделал. Я также решил убрать много вещей, которые я буду хранить в объекте, и поместить его в URL-адрес. –

0

Где именно вызывается исключение null? Вы отлаживаете и видите, что такое null? Является ли HttpContext.Current значением null или User?

+0

Мне сложно отлаживать это, потому что это не происходит все время.На самом деле, я испытываю трудное время, пытаясь воспроизвести это на моей dev-боксе, в тестовой среде или в живой среде. Кажется, что это происходит случайным образом с конечными пользователями. Я проверяю нулевые значения, и это то, где он бросается (внутри статического метода). –

+0

Интересно, истекает ли срок действия билета проверки подлинности форм, что делает Пользователем нулевой. – azamsharp

2

Я столкнулся с этим несколько раз, особенно со статическими методами в другой библиотеке, а не с моим главным проектом. Я прибегал к передаче HttpContext статическому методу в качестве параметра, когда больше ничего не работает.

+0

Хорошее предложение Кит. Благодаря! –

Смежные вопросы