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


79

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

Answers:


148

参见HttpRequest.IsLocal

bool isLocal = HttpContext.Current.Request.IsLocal;

7
那么在哪里请求为空呢。即:Application_start?
Meh Man 2015年

@mmtemporary在Application_Start期间没有请求,没有理由检查Request.IsLocal是否。如果要在Global.asax上使用它,请考虑在Application_BeginRequest中使用它。
Vinicius Rocha

1
@ViniciusRocha在某些情况下,我们希望检查Request为null时的情况。
Meh Man

我们有UnityContainer用于解决依赖项注入。我们有一个IEnvironment依赖项,告诉我们它是本地的,暂存的还是生产的。当请求为空时,我们需要解决此问题。
尼克·尼伯

1
@NickNiebling似乎在混淆术语……我认为这个问题是关于确定当前请求是否来自执行Web应用程序的机器-当然,只有在存在当前请求的情况下,这才有意义。听起来像您,也许真的意味着它是在生产,暂存还是在开发人员机器上运行?至于如何确定,我认为只有您才能决定如何区分它们。配置文件?机器名称模式?执行ASP.Net引擎的系统帐户名称?
Oskar Berggren




1

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


2
是的,但是使用标准库调用可以更好地传达代码的意图,IMO。我宁愿使用该库,也不愿编写自己的代码来做这样简单的事情。
肖恩

我同意。我只想指出,由于指定的答案可能与发布者使用的代码相同,因此答案可能具有相同的局限性。
ZLA 2010年

1
该链接不正确。如果我通过其IP地址在本地访问服务器,则HttpContext.Current.Request.IsLocal会正确返回true,但是UserHostAddress是真实的IP地址,而不是127.0.0.1(或:: 1)。经测试,在.NET 4
mhenry1384

正如mhenry1384所指出的那样。.IsLocal也指的是从SAME机器访问IIS站点时。当从本地计算机进来时,默认情况下,这样做还会显示YSOD详细错误消息。
Piotr Kula

1

如果HttpContext.Current不为null,请使用

HttpContext.Current.Request.IsLocal

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

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

或PC上的专用磁盘。

另一种方法是使用生产中设置的常量编译变量,例如,如果使用Azure和visualstudio.com,则使用它们。

它很脏,但是可以用。


0

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

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


我没有意识到我可以使用HttpContext类访问Request对象。
肖恩

出于好奇,还有什么其他方法可以访问Request对象?谢谢:)
罗曼·罗伊特2009年

6
是的,Request和HttpContext对象在ASP.NET应用程序中并不总是可用。例如Application_Start,在没有HTTPContext的情况下执行。
马克西姆六世。

1
@RomanR。在中创建的作业Application_Start可能总是在后台运行。同样,该问题与页面请求无关。
马克西姆六世。

1
^那么您要依靠什么呢?
eaglei22 '09

0

回应@Meh Men在此主题中对其他答案的评论,他问:

那么在哪里请求为空呢。即:Application_start?

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

这是我如何在一个目前正在从事的特定项目中解决此问题的方式的小样本:

#if DEBUG
    // Code here will only be run locally.
#else
    // Code here will only be run "remotely".
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.