我面临的问题和我的问题如下: -
我只在localhost上运行此代码,是否有免费服务或我可以在线运行此示例网站的东西? 否则下面的代码返回的IP地址始终为127.0.0.1。我如何测试我的代码?目前我给了IP地址的静态值。
HTTP_X_FORWARDED_FOR始终返回空值。我已经读过只有HTTP_X_FORWARDED_FOR包含用户的真实IP地址。
REMOTE_ADDR是否包含用户的真实IP地址,或者其中的IP也可以被欺骗?我只是想知道用户所在的国家/地区,因此我可以根据ISO代码重定向用户。
我面临的一个主要问题是我无法在此Global.asax文件中看到MasterPageFile属性。
我想要的是这样的: -
如果ISO代码为“FR”,那么要为该站点加载的主服务器是FranceMaster.master 否则,如果ISO代码为“GB”,则使用BritainMaster.master文件。
我在这个文件的哪个部分设置主页?
所以基本上我想学习如何根据ISO代码重定向用户并设置母版页。我给了硬编码的IP地址,如122.87.234.1然后它给了我这个错误,无法正确重定向。我用Google搜索并发现了response.redirect 请求被无限期调用。如果以下方式不是你如何重定向用户,怎么办呢?
我确信这种东西已被实施太多次了。有人可以帮我解决这个问题吗?我会很感激。感谢。
下面是我在Global.asax文件中编写的代码: -
<%@ Application Language="C#" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="WorldDomination.Net" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
}
void Application_End(object sender, EventArgs e)
{
// Code that runs on application shutdown
}
void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
}
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
}
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
}
void Application_BeginRequest(object sender, EventArgs e)
{
string ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ip))
{
string[] ipRange = ip.Split(',');
int le = ipRange.Length - 1;
string trueIP = ipRange[le];
ip = trueIP;
}
else
{
ip = Request.ServerVariables["REMOTE_ADDR"];
}
// string userHostIpAddress = "203.1.2.3";
string userHostIpAddress = ip;
IPAddress ipAddress;
if (IPAddress.TryParse(userHostIpAddress, out ipAddress))
{
string country = ipAddress.Country(); // return value: UNITED STATES
string iso3166TwoLetterCode = ipAddress.Iso3166TwoLetterCode(); // return value: US
}
if (ipAddress.Iso3166TwoLetterCode() != null)
{
if (ipAddress.Iso3166TwoLetterCode().ToLower() == "fr")
{
Response.Redirect("www.mysite.fr");
}
if (ipAddress.Iso3166TwoLetterCode().ToLower() == "ja")
{
Response.Redirect("www.mysite.com/BlockedAccess.aspx");
}
}
else
{
Response.Redirect("www.mysite.com");
}
}
</script>
编辑: -
@Chris ::谢谢。我有点困惑。如果IP地址总是被欺骗,我怎么能得到用户的国家?我的意思是如何确保我提取的用户位置是正确的?此外,我必须处理实际应用程序项目中的100页。目前我只是通过一个页面制作一个示例应用程序来尝试它。现在,在所有页面中设置masterpagefile属性是一项非常重要的任务。有没有办法在一个地方完成它?该Web应用程序中确实存在大量页面。请回复。感谢。
答案 0 :(得分:0)
对于重定向错误,请使用Server.Transfer
代替Response.Redirect
。后者实际上会发起一个新请求并导致Application_BeginRequest
代码再次触发,将您的用户启动到无限循环中。
关于您的其他问题:
关于托管,我只会搜索“free asp.net hosting”,或者如果您愿意支付几美元以获得更好的服务find a web host。
HTTP_X_FORWARDED_FOR
。由于您在本地测试并且从不通过代理服务器,因此永远不会填充此变量。我还注意到你的代码正在抓取HTTP_X_FORWARDED_FOR
的最后一个值而不是第一个值。我相信这将为您提供用户通过的最后一个代理的IP地址,而不是实际的客户端IP(也许其他人可以确认这一点)。
用户的IP地址总是可以欺骗。
如果您想动态切换主页,则需要在每个页面的Page_Init
事件中执行此操作。最好的解决方案可能是在global.asax中使用相应的母版页设置会话变量,然后将其指定为Page_Init
中的主页。
的Global.asax:
if (ipAddress.Iso3166TwoLetterCode().ToLower() == "fr")
{
Session["MasterPage"] = "~/FrenchMaster.master";
Server.Transfer("www.mysite.fr");
在每个页面上Page_Init
:
this.MasterPageFile = Session["MasterPage"].ToString();
如果您要沿着这条路走下去,我建议您创建一个自定义页面类来实现这一点,并且您的所有页面依次继承,因此您实际上不必将此代码复制/粘贴到每个页面