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

如果我想根据用户的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应该加载。

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

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

我不完全确定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可能更好,但是对于这个例子,我只是连接值。)你可能还想在更改之前validationSession("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 

您可能会在此页面上找到一些有用的信息, 以编程方式使用ASP.NET母版页 ,这是我抓住第一个代码示例的地方。

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

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