如何使用Global.asax文件重定向用户?

时间:2011-02-22 20:48:46

标签: c# asp.net

如果我想根据用户的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页面,如果是US,那么我想要加载USMaster.master。

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

    我该如何解决?我之前没有和Global.asax合作过如此无能为力。任何帮助将不胜感激。感谢。

3 个答案:

答案 0 :(得分:1)

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

当然,页面需要是一个Content页面,并引用@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,这是我抓住第一个代码示例的地方。

答案 1 :(得分:0)

选中此选项以确定区域设置: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。

答案 2 :(得分:0)

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