确定 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 应用程序?