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

何か案は?ありがとう!

編集します。これはSitecore6.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()呼び出していることです(したがって、Sitecoreがコンテキストを引数として渡す理由)。HttpContext.Current

また、ロードバランサーは例外を説明しませんが、IPが常に同じになる場合は、次のサーバー変数をチェックする方が幸運かもしれません。

args.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
args.Request.ServerVariables["REMOTE_ADDR"]
于 2012-08-24T18:56:21.407 に答える