从HttpModule调用时,Membership.GetUser()失败

时间:2009-08-12 14:45:53

标签: c# .net asp.net

我正在ASP.NET应用程序的Global.asax文件中从Membership.GetUser()方法内部调用Application_Error(),以便记下一些日志信息。

但是,如果在HttpModule中发生错误,它似乎会失败。这是正常的吗?在ASP.NET中执行HttpModules时,是否准备好会员?我做错了吗?

它抛出“未将对象引用设置为对象的实例”。异常(在System.Web.Security .Membership.GetCurrentUserName()处,在System.Web.Security.Membership.GetUser())。

2 个答案:

答案 0 :(得分:3)

会话尚不存在,其中会员资格存储其信息。 FormsAuthentication.SetAuthCookie设置一个cookie,但该cookie被读取。

我会查看Global.asax.cs中的两个事件(或者来自HttpApplication的任何类)

  • AuthenticateRequest
  • 的AcquireRequestState

答案 1 :(得分:1)

您可以在Global的Application_Error中使用HttpApplication.User。 例如:

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
}