如果 ASP.NET 应用程序在本地运行,请在 Global.Asax - Application_Start 中查找

Posted

技术标签:

【中文标题】如果 ASP.NET 应用程序在本地运行,请在 Global.Asax - Application_Start 中查找【英文标题】:Find out in Global.Asax - Application_Start if ASP.NET application running locally 【发布时间】:2011-02-22 13:44:59 【问题描述】:

HttpContext.Current.Request.IsLocal 在 Global.Asax/Application_Start 中不可用(Request 在上下文中不可用)。

我还能如何安全地确定我的 ASP.NET MVC 应用程序是否在本地启动?

这是有条件地重写我的 web.config(取决于应用程序是部署(远程)还是测试(本地))。

谢谢!

【问题讨论】:

Global.asax 中的哪个函数?我相信根据上下文可以使用不同的项目。我相当确定 HttpContext.Current.Request 在 Application_Error 中可用,但在其他中不可用... 你能在 Application.BeginRequest 中使用它吗?它在那里可用.... 没有。这是对配置文件的一次性操作。 Application_Start 在应用程序启动时执行一次(根据需要),BeginRequest 与对应用程序的每个请求一起执行(放置一次性操作的地方非常糟糕)。 好点。只是想了想。 有趣的是,当我通过 VS 在本地执行应用程序时,HttpContext.Current.Request.IsLocal 在 Global.Asax 中有效,但在远程服务器上部署时无效。 【参考方案1】:

Application_Start 事件将在 IIS/cassini/whatever 加载您的应用程序时触发(在发出任何 HTTP 请求之前)。

阅读您的 cmets,您希望这是一个“一次性操作”,这真的没有意义。您的应用程序并不是“本地启动”,而是在其整个生命周期中可能会在本地和/或远程多次请求。考虑到这一点,您需要按照 David 的评论检查每个请求。

也许,如果你能解释一下你想要达到的目标会更好?

【讨论】:

Owen - 我在我的 cmets 中添加了一个解释(对配置文件的一次性操作)。如果应用程序正在远程(生产)或本地启动,我将有条件地重写部分 web.config。所以它绝对“有意义”。 BeginRequest 肯定是错误的地方。 对于这样的事情,你最好使用像 nant 这样的构建脚本工具,或者在构建时在你的 web 配置中弹出正确的值。但这取决于您的部署的复杂性。 或者,您可以检查应用程序正在运行的机器名称并根据此加载适当的配置? 我也不喜欢这样,因为我正在尝试完全自动化。一旦我开始检查硬编码值(例如计算机名称、标志等),我就会失去这种优势。 Alex - 当应用程序启动时,没有本地或远程的概念,因为还没有请求。这听起来很奇怪,但你可以有一个静态 bool _isInitialized,在 BeginRequest 上,检查标志并执行你的配置重写并设置标志,这样就不会再发生了。但是,在第一次请求之后,如果是本地请求,则对服务器的任何远程请求都将以“本地”模式运行。【参考方案2】:

BeginRequest 方法而不是Application_Start 中检查它可能更合适,因为第一个请求可能是本地的,但稍后您可以在其他域上调用应用程序,它将不再是本地的。

【讨论】:

否 - 请参阅我的问题和 cmets。我希望在应用程序启动时只执行一次配置更新。

以上是关于如果 ASP.NET 应用程序在本地运行,请在 Global.Asax - Application_Start 中查找的主要内容,如果未能解决你的问题,请参考以下文章

asp.net web.config的设置问题

asp.net程序在本地IIs运行好用,放到服务器上就出运行时错误

确定 ASP.NET 应用程序是不是在本地运行

如果项目已经在数据库中,请在视图中执行不同的 ActionResult - ASP.NET MVC4 EF5 HTML5

ASP.NET Core 1.1 在本地运行良好,但发布到 Azure 时显示“启动应用程序时发生错误”。

vs2005不能调试ASP.NET程序