我正在尝试使用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
答案 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"]