【问题标题】:How to use Global.asax file to redirect the user?如何使用 Global.asax 文件重定向用户?
【发布时间】:2011-02-22 20:48:45
【问题描述】:

如果我想根据用户的 ISO 代码重定向用户,应该怎么做?

我应该如何首先检测网站用户的 IS 代码?就像我知道的那样,我们使用这些服务器变量来检测客户端 IP 和所有(HTTP_FORWARDED_FOR、REMOTE_ADDRESS 等)但信息 在我读过的许多网站上关于它们的信息让我对使用什么感到困惑。就像有人说 HTTP_FORWARDED_X 返回的 IP 可以用逗号分隔,在这些 IP 中,人们不确定哪个是真实 IP,哪个是代理地址。此外,返回的所有 IP 地址都可能是假的。

所以我的问题是:-

  1. 如何获取一个人的真实 IP 地址?就像我只想知道一个特定的人坐在哪个国家,这样我就可以相应地重定向用户。

  2. 其次,假设一个人坐在美国,然后我希望将用户重定向到 www.mysite.us。 如果有人从德国访问我的网站,www.mysite.de 是我希望此人被重定向到的地址。

  3. 此外,如果 DE 是 ISO 代码,那么我希望加载 GermanMaster.master 页面,如果是美国,那么我希望加载 USMaster.master。

那么我如何获取用户的非伪造 IP 地址,根据该 ISO 代码重定向用户,然后根据 ISO 代码加载母版页。

我该怎么做?我以前从未与 Global.asax 合作过,所以对如何去做这一切一无所知。任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    我不完全确定 IP 地址定位服务,但如果您想根据某些标准动态加载特定的 MasterPage,那么您需要在页面的生命周期中使用 Page_PreInit 事件。

    当然,该页面需要是一个内容页面,并在@Page 指令中引用了一个MasterPage。在@Page 指令中使用哪个MasterPage 并不重要,只要它表明该页面是内容页面即可。在后面的代码中(或在基类中),可以使用如下代码:

    C#

    void Page_PreInit(Object sender, EventArgs e) {
        this.MasterPageFile = "~/NewMaster.master";
    }
    

    VB

    Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit
        Me.MasterPageFile = "~/NewMaster.master"
    End Sub
    

    您只需在此方法中添加任何您想要的逻辑来选择正确的 MasterPage。关键是您必须在PreInit 事件中进行更改。不允许在该事件之后更改 MasterPage,ASP.NET 将引发严重错误。

    作为对此的扩展,我实现了一种技术,该技术利用Session_Start 方法执行确定当前MasterPage 的逻辑,将文件名放入Session。然后PreInit 方法将简单地从Session 加载MasterPage 文件名,而不必考虑使用哪一个。 (使用String.Format 可能会更好,但在本例中,我只是连接这些值。)您可能还想验证Session("MasterPage") 确实有一个值(甚至可能是一个有效值)在更改 MasterPageFile 属性之前。如果您将其更改为不存在的文件,事情可能会变得有些难看。

    C#

    void Page_PreInit(Object sender, EventArgs e) {
        this.MasterPageFile = "~/MasterPages/" + Session("MasterPage") + ".master";
    }
    

    VB

    Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit
        Me.MasterPageFile = "~/MasterPages/" & Session("MasterPage") & ".master"
    End Sub
    

    您可能会在此页面上找到一些有用的信息,Working with ASP.NET Master Pages Programmatically,这是我获取第一个代码示例的地方。

    【讨论】:

      【解决方案2】:

      你需要看看全球化和本地化,MSDN网上有一些很好的资源here。要从 IP 地址获取用户地理数据,有几个服务,我有 Maxmind 静态数据和 Web 服务,没有问题。

      【讨论】:

        【解决方案3】:

        检查此以确定语言环境:http://www.west-wind.com/weblog/posts/334.aspx

        然后在 global.asax 中,如果你想在用户会话开始时检查这个,那么使用 Session_Start,还有应用程序的 BeginRequest 事件(http://msdn.microsoft.com/en-us/library/system .web.httpapplication.beginrequest.aspx)。我不知道 BeginRequest 对于处理程序来说是否为时过早,我们在 AcquireRequestState 中进行了一些检查(一旦建立会话就会触发)。这取决于您是想在应用程序第一次运行时运行代码,还是每次页面回发时运行代码。

        此外,您可以将其构建到框架中;创建您自己的自定义页面类,它会在每次页面加载或页面第一次运行时进行检查。

        HTH。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-01
          • 2012-09-04
          • 1970-01-01
          • 2013-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-15
          相关资源
          最近更新 更多