使用Sitecore CMS管道处理器,如何根据用户的IP地址重定向用户?

时间:2012-08-24 18:21:37

标签: c# geolocation ip sitecore pipeline

我正在尝试使用httpRequestBegin管道处理器执行此操作,但我似乎无法从给定的HttpRequestArgs参数访问用户的IP地址。

当我实现具有此方法的类

public void Process(HttpRequestArgs args) {
    string ipAddress = args.Context.Request.UserHostAddress; // Not working
    string state = GetState(ipAddress); // already implemented elsewhere
    RedirectUserByState(state);  // already implemented elsewhere
}

我认为这可能会保留用户的IP地址

args.Context.Request.UserHostAddress

但它会导致此错误(堆栈跟踪表明它来自Process方法):

System.Web.HttpException: Request is not available in this context

有什么想法吗?谢谢!

编辑,这是在Sitecore 6.1和web.config中

<pipelines>
<!--...-->
    <httpRequestBegin>
        <!--...-->
        <processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel"/>
        <processor type="MySolution.Redirector, MySolution"/>
        <processor type="Sitecore.Pipelines.HttpRequest.LayoutResolver, Sitecore.Kernel"/>
        <!--...-->
    </httpRequestBegin>
    <!--...-->
</pipelines>

此服务器可能位于负载均衡器后面。

编辑2:看起来我 试图在Process()函数中访问这两个,这就是造成错误的原因:

Sitecore.Context.Request
Sitecore.Context.Response

1 个答案:

答案 0 :(得分:2)

您定义管道的位置很好。在请求处理的此步骤中应该可以使用args.Context.Request。最可能的原因是在上下文不可用的某些情况下会唤起此处理器。对以下内容的简单检查应该处理这些情况:

if (args.Context != null)
{
    //....
}

我能想到的唯一其他解释是GetState()RedirectUserByState()正在调用HttpContext.Current此时无法使用(因此Sitecore将上下文作为参数传递)。

此外,负载均衡器不会解释异常,但如果IP最终总是相同的话,您可以更好地检查以下服务器变量:

args.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
args.Request.ServerVariables["REMOTE_ADDR"]