Сбой Membership.getUser() при вызове из HttpModule

#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
}