c# 中有没有办法检查应用程序是否在 localhost(而不是生产服务器)上运行?
我正在编写一个需要使用某个邮件队列的群发邮件程序,它在本地主机上运行。
if (Localhost)
{
Queue = QueueLocal;
}
else
{
Queue = QueueProduction;
}
由于评论有正确的解决方案,我将把它作为答案发布:
HttpContext.Current.Request.IsLocal
怎么样的东西:
public static bool OnTestingServer()
{
string host = HttpContext.Current.Request.Url.Host.ToLower();
return (host == "localhost");
}
在应用程序配置文件中使用一个值,该值将告诉您您所处的环境。
由于您使用的是 asp.net,因此您可以利用配置文件转换来确保每个环境的设置都是正确的。
看看这是否有效:
public static bool IsLocalIpAddress(string host)
{
try
{ // get host IP addresses
IPAddress[] hostIPs = Dns.GetHostAddresses(host);
// get local IP addresses
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
// test if any host IP equals to any local IP or to localhost
foreach (IPAddress hostIP in hostIPs)
{
// is localhost
if (IPAddress.IsLoopback(hostIP)) return true;
// is local address
foreach (IPAddress localIP in localIPs)
{
if (hostIP.Equals(localIP)) return true;
}
}
}
catch { }
return false;
}
本地主机 ip 地址是恒定的,您可以使用它来确定它是本地主机还是远程用户。
但请注意,如果您登录生产服务器,它也将被视为 localhost。
这涵盖了 IP v.4 和 v.6:
public static bool isLocalhost( )
{
string ip = System.Web.HttpContext.Current.Request.UserHostAddress;
return (ip == "127.0.0.1" || ip == "::1");
}
要完全确定代码在哪个服务器上运行,您可以使用 MAC 地址:
public string GetMACAddress()
{
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
String sMacAddress = string.Empty;
foreach (NetworkInterface adapter in nics)
{
if (sMacAddress == String.Empty)// only return MAC Address from first card
{
IPInterfaceProperties properties = adapter.GetIPProperties();
sMacAddress = adapter.GetPhysicalAddress().ToString();
}
} return sMacAddress;
}
例如,与 web.config 中的 MAC 地址进行比较。
public static bool isLocalhost( )
{
return GetMACAddress() == System.Configuration.ConfigurationManager.AppSettings["LocalhostMAC"].ToString();
}
不幸的是HttpContext.HttpRequest.IsLocal()
,核心中不再存在。
但是在检查 .Net 中的原始实现之后,很容易通过检查重新实现相同的行为HttpContext.Connection
:
private bool IsLocal(ConnectionInfo connection)
{
var remoteAddress = connection.RemoteIpAddress.ToString();
// if unknown, assume not local
if (String.IsNullOrEmpty(remoteAddress))
return false;
// check if localhost
if (remoteAddress == "127.0.0.1" || remoteAddress == "::1")
return true;
// compare with local address
if (remoteAddress == connection.LocalIpAddress.ToString())
return true;
return false;
}
或者,如果您只是针对开发环境,您可以使用C# 预处理器指令(这是假设您的应用程序没有在生产中调试运行!):
#if debug
Queue = QueueLocal;
#else
Queue = QueueProduction;
像这样:
HttpContext.Current.Request.IsLocal
字符串主机名 = Request.Url.Host.ToString();
我知道这是真正的老线程,但仍然有人在寻找直接的解决方案,那么您可以使用它:
if (HttpContext.Current.Request.Url.Host == "localhost")
{
//your action when app is running on localhost
}
这是另一种更透明的选择:
public static bool IsLocal
{
// MVC < 6
get
{
var authority = HttpContext.Request.Url.Authority.ToLower();
return authority == "localhost" ||
authority.StartsWith("localhost:");
}
// MVC 6+
get
{
return String.Compare(HttpContext.Request.Url.Host, "localhost",
StringComparison.OrdinalIgnoreCase);
}
}
如果您没有在 then 中执行此操作,请Controller
添加 Current
after HttpContext
,如HttpContext.Current.Request...
此外,在MVC 6
,在View
,HttpContext
只是Context