我正在运行一个Web应用程序,如果它在本地运行时会显示一些调试行为 - 引用资源字符串等等 - 我想在我的笔记本电脑上演示应用程序,我将无法上网访问,所以它必须是本地的。
应用程序使用HttpContext.Current.Request.IsLocal来确定它是否在本地运行 - 有什么方法可以欺骗它吗?我想欺骗它返回“假”,即使我确实在本地运行。
我可以访问源代码(并且意识到我可以演示一个“IsLocal”检查被注释掉的构建),但是不想为这个演示做一个特殊的构建。如果需要,我会这样做,但我宁愿使用现有的代码库。
答案 0 :(得分:17)
Request.IsLocal属性实现以下代码:
public bool IsLocal {
get {
String remoteAddress = UserHostAddress;
// 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 == LocalAddress)
return true;
return false;
}
来源:已解压缩的源代码(Microsoft:referencesource.microsoft.com)
希望这有帮助!
答案 1 :(得分:3)
这需要在对本地IIS实例的请求中欺骗非本地IP地址。我认为你制作一个演示版本可能花费的时间少于尝试使用它的时间。
答案 2 :(得分:1)
我相信这是真的,但现在无法验证。
当站点绑定到环回地址127.0.0.1时,IsLocal返回True。
如果你确定在IIS中你的网站绑定到你机器的一个非环回地址(即192.168.1.100),那么IsLocal应该返回False。
根据定义,Cassini始终是本地的,因为它只能绑定到环回地址。
答案 3 :(得分:1)
如果您的服务器有多个IP地址,则需要一些额外的代码。以下处理多个IP地址,并处理类似cloudflare的CDN,它将在Request.UserHostAddress属性中具有错误的IP地址。
代码:
private bool IsLocal()
{
if (Request.IsLocal)
{
return true;
}
string forwardIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces())
{
IPInterfaceProperties ipProps = netInterface.GetIPProperties();
foreach (UnicastIPAddressInformation addr in ipProps.UnicastAddresses)
{
string ipString = addr.Address.ToString();
if (Request.UserHostAddress == ipString || forwardIP == ipString)
{
return true;
}
}
}
return false;
}