如果 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程序在本地IIs运行好用,放到服务器上就出运行时错误
如果项目已经在数据库中,请在视图中执行不同的 ActionResult - ASP.NET MVC4 EF5 HTML5