0

我正在尝试使用 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
4

1 回答 1

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"]
于 2012-08-24T18:56:21.407 回答