使用Global.asax文件重定向用户时出错::未正确重定向页面

时间:2011-02-24 22:14:27

标签: c# asp.net

我面临的问题和我的问题如下: -

  1. 我只在localhost上运行此代码,是否有免费服务或我可以在线运行此示例网站的东西? 否则下面的代码返回的IP地址始终为127.0.0.1。我如何测试我的代码?目前我给了IP地址的静态值。

  2. HTTP_X_FORWARDED_FOR始终返回空值。我已经读过只有HTTP_X_FORWARDED_FOR包含用户的真实IP地址。

  3. REMOTE_ADDR是否包含用户的真实IP地址,或者其中的IP也可以被欺骗?我只是想知道用户所在的国家/地区,因此我可以根据ISO代码重定向用户。

  4. 我面临的一个主要问题是我无法在此Global.asax文件中看到MasterPageFile属性。

    我想要的是这样的: -

  5. 如果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应用程序中确实存在大量页面。请回复。感谢。

1 个答案:

答案 0 :(得分:0)

对于重定向错误,请使用Server.Transfer代替Response.Redirect。后者实际上会发起一个新请求并导致Application_BeginRequest代码再次触发,将您的用户启动到无限循环中。

关于您的其他问题:

  1. 关于托管,我只会搜索“free asp.net hosting”,或者如果您愿意支付几美元以获得更好的服务find a web host

  2. 当通过代理服务器转发请求时,将填充
  3. HTTP_X_FORWARDED_FOR。由于您在本地测试并且从不通过代理服务器,因此永远不会填充此变量。我还注意到你的代码正在抓取HTTP_X_FORWARDED_FOR的最后一个值而不是第一个值。我相信这将为您提供用户通过的最后一个代理的IP地址,而不是实际的客户端IP(也许其他人可以确认这一点)。

  4. 用户的IP地址总是可以欺骗。

  5. 如果您想动态切换主页,则需要在每个页面的Page_Init事件中执行此操作。最好的解决方案可能是在global.asax中使用相应的母版页设置会话变量,然后将其指定为Page_Init中的主页。

  6. 的Global.asax:

    if (ipAddress.Iso3166TwoLetterCode().ToLower() == "fr")
    {
        Session["MasterPage"] = "~/FrenchMaster.master";
        Server.Transfer("www.mysite.fr");
    

    在每个页面上Page_Init

    this.MasterPageFile = Session["MasterPage"].ToString();
    

    如果您要沿着这条路走下去,我建议您创建一个自定义页面类来实现这一点,并且您的所有页面依次继承,因此您实际上不必将此代码复制/粘贴到每个页面