【问题标题】:ASP.NET Web Application not executing code in Global.asaxASP.NET Web 应用程序未在 Global.asax 中执行代码
【发布时间】:2019-12-07 06:05:44
【问题描述】:

我继承了大约 10 年前构建的 ASP.NET Web 应用程序。我正在使用 VS 2019 社区。我正在尝试在 Global.asax.cs 的 Application_Start 挂钩中设置 log4net 的配置加载。经过多次故障排除后,我发现 Global.asax.cs 中的任何代码在本地调试时都没有执行。我通过尝试从 Application_Start 抛出一个从未发生过的异常来确定这一点。到目前为止,这是我按粗略顺序尝试过的:

1) 我重命名了旧的 Global 并通过 Project->Add_New_Item->Global_Application_Class 添加了一个新的。我将每个类方法设置为仅包含throw new Exception("wtf");。尽管如此,异常不会触发。 Global.asax.cs 的具体代码如下。

2) 我选中了项目/Web 设置下的“启用编辑并继续”框。还是没有变化。

3) 我确保 IIS 已停止,甚至退出/重新启动 VS 2019,并重新启动了我的计算机。清理整个项目并重建它。不过,什么都没有。

4) 我尝试将我的真实项目从“.NET Framework 4”切换到“.NET Framework 4.7.2”。它没有帮助。

5) 我从头开始创建了一个新的 Web 应用程序项目,添加了一个 Global.asax,就像我在上面 #1 中所做的那样,并且 IT WORKS 完全符合我的预期。这似乎表明我的 VS/IIS 正在工作。

由于 webapp-from-scratch 工作正常,它似乎将矛头指向了我真正的 webapp 中的某些东西。我试着四处寻找两个项目之间的差异,但空手而归。 IIS 如何知道执行全局代码?我还需要在我的项目中配置什么,以便 IIS 执行该代码吗?

2019 年 12 月 7 日更新。这是 Global.asax* 文件的代码:

<%@ Application Codebehind="Global.asax.cs" Inherits="TM.Website.Global" Language="C#" %>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace TM.Website
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {
            throw new Exception("wtf");
        }

        protected void Session_Start(object sender, EventArgs e)
        {
            throw new Exception("wtf");
        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            throw new Exception("wtf");
        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            throw new Exception("wtf");
        }

        protected void Application_Error(object sender, EventArgs e)
        {
            throw new Exception("wtf");
        }

        protected void Session_End(object sender, EventArgs e)
        {
            throw new Exception("wtf");
        }

        protected void Application_End(object sender, EventArgs e)
        {
            throw new Exception("wtf");
        }
    }
}

【问题讨论】:

  • 新类是否继承自HttpApplication?你可能只能有一个类从 HttpApplication 继承,不管它的名字是什么,所以删除旧的,不要只是重命名它
  • @GarrGodfrey 我以为就是这样,但唉,这并没有什么不同。我对整个源代码进行了检查,以确保只有一个类继承自 System.Web.HttpApplication,并且得到了确认。我还重新启动了 VS 并清理/重建了项目。
  • 你能介绍一下课程吗?你确定它是公开的吗?
  • @GarrGodfrey 是的,它是公开的。我刚刚将两个 Global.asax* 文件的源代码添加到问题的末尾。
  • 经过更多修改,包括通过 dotPeek 挖掘 webapp DLL,并在工作项目和损坏项目之间区分 applicationhost.config 文件,我对项目中导致我的问题的任何东西都束手无策.一时兴起,我决定使用 VS 而不是 WSL 上的 CLI git 将我的 git repo 重新克隆到一个新位置,令我惊讶的是,它现在似乎可以工作了。我将在早上我的眼睛/大脑新鲜时再试一次,以尝试缩小根本原因。

标签: asp.net


【解决方案1】:

我已经修复了我的环境,但我仍然不知道出了什么问题。我所做的只是使用 VS2019 的内置 git 客户端将我的项目重新克隆到 c: 上的不同位置。出于某种原因,旧目录(我通过 WSL 创建)无法正常工作。我认为这是由于 WSL 创建文件/目录的方式与本机文件系统不同,因此我开始尝试几种不同的组合来看看会发生什么。请注意,我按顺序执行了以下所有操作:

0) 我让 VS2019 创建 source/repos/ 目录并将我的项目克隆到其中。这很好用(我的全局挂钩运行)。这就是上面所描述的。

1) 我将 source/ 目录重命名为 source.bak/,使用 WSL 创建了一个新的 source/,然后使用 WSL 从 #0 复制项目文件。这很好用。

2) 我从 #1 中创建的新 source/ 目录中删除了项目,并从我的旧位置 (scm/) 复制了它。这不起作用(全局挂钩不运行)。

3) 我意识到来自不同位置的项目文件可能在某些地方嵌入了旧路径。我清除了所有 bin/、obj/ 和 .vs/ 目录。我对旧目录的项目执行了 grep,但没有找到与旧位置相关的任何内容。然后我在工作目录和非工作目录之间运行了diff -bur,发现除了一个空的 App_Data 文件夹之外没有任何区别。不过,全局挂钩没有运行。

据我所知,项目的工作版本和非工作版本之间的文件内容没有区别。导致此问题的非工作文件中一定有一些元数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2017-05-26
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多