#c# #.net #asp.net
#c# #.net #asp.net
Вопрос:
Я вызываю метод Membership.GetUser()
изнутри Application_Error()
в глобальном файле.asax в ASP.NET приложение для записи некоторой информации журнала.
Однако, похоже, что происходит сбой, если ошибка возникает внутри HttpModule. Это нормально? Не готово ли членство при выполнении HttpModules в ASP.NET ? Я делаю что-то не так?
Он выдает «Ссылка на объект, не установленная для экземпляра объекта». исключение (в System.Web.Security.Членство.GetCurrentUserName() в System.Web.Security.Membership.&etUser()).
Комментарии:
1. Не могли бы вы уточнить? Выдает ли это ошибку или просто возвращает null?
2. Да, извините. Он выдает «Ссылка на объект, не установленная для экземпляра объекта». исключение (в System.Web.Security. Членство. GetCurrentUserName() в System.Web.Security. Membership.&etUser())
3. HttpRequest проходит через стеки HttpModules, прежде чем HttpHandler возьмет верх. MembershipProvider является одним из таких модулей. Я предполагаю, что вы можете «&etUser» из веб-формы или обработчика. Доступ к MembershipProvider с другой стороны может быть невозможен (мое предположение). Однако это может быть проблема с конфигурацией HtpModule в web.confi&. Тем временем пользователь. Идентификация. Имя, похоже, является правильным решением.
Ответ №1:
Сеанс, в котором членство хранит свою информацию, еще не существует. Проверка подлинности формы.SetAuthCookie устанавливает файл cookie, но этот файл cookie считывается.
Я бы посмотрел на два события в вашем Global.asax.cs (или любом другом классе, производном от HttpApplication)
- Запрос аутентификации
- AcquireRequestState
Ответ №2:
Вы можете использовать HttpApplication.Пользователь изнутри глобального Application_Error. например:
User.Identity.Name
Вот один из них, который я использую:
protected void Application_Error(object sender, EventAr&s e)
{
try
{
Exception lastError = Server.GetLastError().GetBaseException();
if (lastError is HttpException amp;amp; ((HttpException)lastError).GetHttpCode() == 404)
return;
if (Request.UrlReferrer != null)
lastError.Data.Add("Referrer", Request.UrlReferrer);
if (Request.RawUrl != null)
lastError.Data.Add("Pa&e", Request.RawUrl);
if (Request.UserHostAddress != null)
lastError.Data.Add("Client IP", Request.UserHostAddress);
if (Request.UserA&ent != null)
lastError.Data.Add("UserA&ent", Request.UserA&ent);
if (User != null amp;amp; User.Identity != null amp;amp; !strin&.IsNullOrEmpty(User.Identity.Name))
lastError.Data.Add("User", User.Identity.Name);
Lo&.Error("Application_Error trapped at Global.asax", lastError);
}
// ReSharper disable EmptyGeneralCatchClause
catch { } // Intentionally empty catch clause as this is the catchall exception handler. If it fails, the sky has fallen.
// ReSharper restore EmptyGeneralCatchClause
}