Непонятно с оригинального сообщения, что 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
, чтобы узнать, где/когда цепочка начинается, поэтому вам не нужно вносить изменения, описанные выше - Я просто рекомендую общий подход, который поможет уменьшить эти ошибки «пропавших без вести» в будущем.
Каковы статические методы? Где их зовут? – SLaks