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

Posted

技术标签:

【中文标题】确定 ASP.NET 应用程序是不是在本地运行【英文标题】:Determine if ASP.NET application is running locally确定 ASP.NET 应用程序是否在本地运行 【发布时间】:2010-10-16 01:36:41 【问题描述】:

我想知道是否有推荐的方法来确定一个 asp 应用程序是否在本地运行。目前,我使用 Request 对象并在服务器变量上对 localhost 或 127.0.0.1 进行字符串搜索,但这有几个限制。最大的问题是 Request 对象在我需要时并不总是可用。

【问题讨论】:

【参考方案1】:

见HttpRequest.IsLocal

bool isLocal = HttpContext.Current.Request.IsLocal;

【讨论】:

Request 为空的情况如何。即:Application_start? @mmtemporary 在 Application_Start 期间没有请求,没有理由检查 Request.IsLocal 与否。如果您想在 Global.asax 上使用它,请考虑在 Application_BeginRequest 中使用它。 @ViniciusRocha 在某些情况下,我们希望检查 Request 何时为空。 我们有 UnityContainer 来解决依赖注入。我们有一个 IEnvironment 依赖告诉我们它是本地的、暂存的还是生产的。当请求为空时,我们需要解决这个问题。 @NickNiebling 似乎是一个术语混淆......我认为这个问题是关于确定当前请求是否来自执行 Web 应用程序的机器 - 这当然只有在有当前请求。听起来像您也许真的是说它是在生产、登台还是开发人员机器上运行?至于如何确定,我认为只有您可以决定如何区分它们。配置文件?机器名称模式?执行 ASP.Net 引擎的系统帐户的名称?【参考方案2】:

您可以检查 Request.IsLocal 属性

【讨论】:

【参考方案3】:

这对我来说适用于 Application_Start

if (!HostingEnvironment.IsDevelopmentEnvironment)

      GlobalFilters.Filters.Add(new RequireHttpsAttribute());

要了解更多关于 IsDevelopmentEnvironment 是如何设置的,请看下面的帖子。

In ASP.NET, what determines the value of HostingEnvironment.IsDevelopmentEnvironment?

【讨论】:

如果有人为此锁定,也有相反的情况:HostingEnvironment.IsHosted【参考方案4】:

在 MVC 视图/ASP 页面/类后面的代码中:

bool isLocal = HttpContext.Current.Request.IsLocal;

在 MVC 控制器中:

bool isLocal = Request.IsLocal;

【讨论】:

【参考方案5】:

针对@Meh Men 对此线程中其他答案的评论,谁问:

Request 为空的情况如何。即:Application_start?

如果您确定您的网站的生产和测试或“同源”版本都将与您网站的发布版本一起部署,而您的本地环境将以“调试”模式构建和开发,您可以使用的#if DEBUG sintax 编写只应在本地运行的代码,而在此块之外,甚至在匹配的#else 块内,您可能会编写一些您希望仅在非本地时运行的其他代码(例如:远程)。

以下是我目前正在从事的特定项目中如何解决此问题的一个小示例:

#if DEBUG
    // Code here will only be run locally.
#else
    // Code here will only be run "remotely".

【讨论】:

这是金子!谢谢!【参考方案6】:

Request.IsLocal 与检查 127.0.0.1 或 ::1 相同。见这篇文章:http://forums.asp.net/p/1065813/4081335.aspx。

【讨论】:

是的,但是使用标准库调用可以更好地传达代码的意图,IMO。我宁愿使用库而不是编写自己的代码来做这么简单的事情。 我同意。我只是想指出,由于指定的答案可能与发布者使用的代码相同,因此答案可能具有相同的限制。 该链接不正确。如果我通过其 IP 地址在本地访问我的服务器,HttpContext.Current.Request.IsLocal 会正确返回 true,但 UserHostAddress 是真实的 IP 地址,而不是 127.0.0.1(或 ::1)。在 .NET 4 中测试。 正如 mhenry1384 指出的那样。IsLocal 也指当您从同一台机器访问 IIS 站点时。当从本地机器进入时,这样做也会默认显示 YSOD 详细的错误消息。【参考方案7】:

如果 HttpContext.Current 不为空,则使用

HttpContext.Current.Request.IsLocal

否则,例如在 App_Start 或 HttpContext.Current 可用之前,您可以测试

HostingEnvironment.ApplicationPhysicalPath.StartsWith(@"C:\")

或您 PC 上的专用磁盘。

另一种方法是在生产环境中使用常量编译变量集,例如来自 Azure 和 visualstudio.com(如果您使用它们)。

它很脏,但它可以工作。

【讨论】:

【参考方案8】:

请求在 ASP.NET 环境中并不总是可用?

HttpContext 及其属性 Request/Response 在服务器开始处理页面后立即被初始化。因此,在页面生命周期中,您可以在任何地方执行 c# 代码,您应该能够检查请求 url。

【讨论】:

我没有意识到我可以使用 HttpContext 类来访问 Request 对象。 出于好奇,还有什么其他方法可以访问 Request 对象?谢谢:) 是的,Request 和 HttpContext 对象在 ASP.NET 应用程序中并不总是可用的。例如,Application_Start 在没有 HTTPContext 的情况下执行。 @RomanR。在Application_Start 中创建的作业可能总是在后台运行。这个问题也与页面请求无关。 ^ 那你靠什么?

以上是关于确定 ASP.NET 应用程序是不是在本地运行的主要内容,如果未能解决你的问题,请参考以下文章

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

如何确定当前在 ASP.Net 中是不是有任何文件正在上传?

ASP.NET Core 托管捆绑包 5 是不是也可以运行 .NET/ASP.NET Core 2.1 应用程序?

ASP.NET 会话的寿命是不是比应用程序长

如何以编程方式检测我的应用程序是不是在 ASP.NET 页面内以 IIS 7.0 集成模式运行

使用 ASP .Net 管理本地机器上的进程