2009-08-12 6 views
2

Я вызываю Membership.GetUser() изнутри метода Application_Error() в файле Global.asax в приложении ASP.NET, чтобы записать некоторые данные журнала.Членство.GetUser() терпит неудачу при вызове из HttpModule

Однако, похоже, что ошибка в HttpModule произошла с ошибкой. Это нормально? Не является ли членство готовым во время выполнения HttpModules в ASP.NET? Я делаю что-то неправильно?

Он выбрасывает «Ссылка на объект, не установленную на экземпляр объекта». исключение (в System.Web.Security.Membership.GetCurrentUserName(), в System.Web.Security.Membership.GetUser()).

+1

Можете ли вы быть более конкретным? Выбрасывает ошибку или просто возвращает null? – JoshJordan

+0

Да, извините. Он выбрасывает «Ссылка на объект, не установленную на экземпляр объекта». Исключение (в System.Web.Security.Membership.GetCurrentUserName(), в System.Web.Security.Membership.GetUser()) –

+0

HttpRequest проходит через стеки HttpModules до того, как HttpHandler берет верх. MembershipProvider - один из этих модулей. Я предполагаю, что вы можете «GetUser» из веб-формы или обработчика. Возможно, невозможно выполнить членствоProvider с другой стороны (моя догадка). Однако может быть проблемой конфигурации HtpModule в web.config. Тем временем User.Identity.Name, похоже, путь. –

ответ

3

сессия еще не существует, где членство хранит информацию. FormsAuthentication.SetAuthCookie устанавливает cookie, но этот файл cookie считывается.

Я хотел бы посмотреть на два события в вашей Global.asax.cs (или любой другой класс является производным от HttpApplication)

  • AuthenticateRequest
  • AcquireRequestState
1

Вы можете использовать HttpApplication.User из приложения Global_ Application_Error. например:

User.Identity.Name 

Вот один я использую:

protected void Application_Error(object sender, EventArgs e) 
{ 
    try 
    { 
     Exception lastError = Server.GetLastError().GetBaseException(); 
     if (lastError is HttpException && ((HttpException)lastError).GetHttpCode() == 404) 
      return; 

     if (Request.UrlReferrer != null) 
      lastError.Data.Add("Referrer", Request.UrlReferrer); 
     if (Request.RawUrl != null) 
      lastError.Data.Add("Page", Request.RawUrl); 
     if (Request.UserHostAddress != null) 
      lastError.Data.Add("Client IP", Request.UserHostAddress); 
     if (Request.UserAgent != null) 
      lastError.Data.Add("UserAgent", Request.UserAgent); 
     if (User != null && User.Identity != null && !string.IsNullOrEmpty(User.Identity.Name)) 
      lastError.Data.Add("User", User.Identity.Name); 

     Log.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 
} 
Смежные вопросы