类型' System.InvalidOperationException'的例外情况发生在System.Web.dll中但未在用户代码中处理

时间:2015-03-26 14:16:49

标签: c# asp.net asp.net-mvc .net-4.0

我不是开发人员。 我正在进入移民项目。我正在尝试将应用程序从VS 2010迁移到VS 2013,在VS 2010中,应用程序运行正常,没有任何错误。

但是在迁移之后,运行应用程序时会出现以下运行时错误。我刚刚被困在这里。

  

System.Web.dll中出现'System.InvalidOperationException'类型的异常,但未在用户代码中处理

     

附加信息:此方法只能在调用之后调用   认证事件。

Global.asax中的小代码用于检查应用程序的权限。

 public void Application_BeginRequest(object sender,EventArgs e)
    {
        if (!Request.Path.Contains("NoAccess"))
        {
            //Checks rights to application
            var secData = SecurityProvider.GetSecurityData("TEST", Request.LogonUserIdentity, false);

            var access = new SecurityClient(secData).HasAccess("TEST", SecurityAccessLevel.Read);

            if (!access)
            {
                Response.Redirect("NoAccess");
            }
        }

错误指向Request.LogonUserIdentity

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

根据http://www.iis.net/learn/application-frameworks/building-and-running-aspnet-applications/aspnet-20-breaking-changes-on-iis

"您将收到一个ASP.NET 500 - 服务器错误:此方法只能在身份验证事件后调用。在PostAuthenticateRequest之前访问时,HttpRequest.LogonUserIdentity会抛出InvalidOperationException,因为在客户端经过身份验证之前,此属性的值是未知的。"

解决方法是将代码移入PostAuthenticateRequest事件(或更高版本)

请将此添加到您的Global.asax

protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
{
    if (!Request.Path.Contains("NoAccess"))
    {
        //Checks rights to application
        var secData = SecurityProvider.GetSecurityData("TEST", Request.LogonUserIdentity, false);

        var access = new SecurityClient(secData).HasAccess("TEST", SecurityAccessLevel.Read);

        if (!access)
        {
            Response.Redirect("NoAccess");
        }
    } 
}

然后删除Application_BeginRequest事件中的所有代码。