1

ウェブサイトに問題があります。サーバーはIIS7で、.NET4.0CLRでASP.NETを実行しています。私たちはSitecoreアプリケーションをホストしており、タグとして追加することを躊躇しました。なぜなら、それは質問の「理由」であり、必ずしも問題を引き起こしている基盤となる技術に関連しているとは限らないからです。

Sitecoreが行うことの1つは、大量のカスタムパイプラインを追加することです。これらのパイプラインの1つは、と呼ばれLayoutResolverPipeline、要求されたページが使用するレイアウトファイルへのパスを決定する役割を果たします。複数のドメインにわたってグローバルコンテンツアイテムをホストするための非常に便利で複雑な方法を考え出しました。どのドメインがどのアイテムを提供するかは、Administrator Web GUI(別名Sitecoreシェル)を介して完全に構成可能です。最終的な目標は、マーケティング/消費者エクスペリエンスチームが多変量テストを実行して、最高のユーザーエクスペリエンスを見つけることができるようにすることです。

そのために、現在のユーザーに関するすべて、現在のシステムとドメイン設定に関するすべてを検討し、顧客に提供するエクスペリエンスを決定する「起動」ページがあります。ほとんどのドメインでは、これはサイコロの重み付きロールに帰着します-テスト結果が統計的に健全であるためには、それらは十分にランダムでなければなりません。これはとして記述され、IHttpHandlerその決定をに格納しますHttpContext.Current.Session(これは、インターフェイスを実装することによっても実現されIRequiresSessionStateます)。決定は保存されるので、顧客がバックトラックすることを決定した場合、サイコロを振り直すのではなく、訪問中一貫したエクスペリエンスを提供します。決定は、顧客の訪問で次のページに向けて302リダイレクトを発行するハンドラーによって実行されます。

起動ハンドラーは、通常の方法でweb.configファイルで定義されます。

<system.webServer>
<handlers>
    <add verb="*" path="launch.ashx"
       type="CMS.HttpHandlers.LaunchRequestHandler, CMS"
       name="LaunchHandler"/>

私たちは時々、何らかの理由で、彼らのページと私たちのページの間に結果として生じる302を望まないパートナーと取引をします。代わりに、特定のカスタマーエクスペリエンスに直接リンクします。ただし、時間の経過とともに、ユーザーエクスペリエンス全体が減価償却、移動、または廃止されます。これにより、特定の要求が厳しく怠惰なパートナーにとって、サポートされていないアイテムや存在しないアイテムへのリンクが長引くことになります。また、入力ミス、記憶ミス、リンクミス、ブラウザの履歴からの再訪、またはランダムなURLの試行などの場合にも対処する必要があります。

これらの後者の場合は、でいくつかの厄介な例外が発生しましたLayoutResolverPipelineLaunchHandler何をすべきかわからない場合にフォールバックさせることで、これらの例外を解決しようとしています。LaunchHandlerこれをリダイレクトとして実装しましたが、単純に直接呼び出したいと思います。とにかく、別のアイテムに対して301を実行します。また、1つのリクエストで複数のリダイレクトを行うことは、コストのかかるリソースの浪費であり、回避したいと思います。

十分な背景。問題は、セッション情報の準備が整うかなり前のIIS処理スタックの部分にLayoutResolverPipelineバインドされていることです。HttpBeginRequestこれはSitecoreの制約であり、他の多くの問題を解決せずに移動することはできません。

質問:

  1. IHttpHandlerバインドされているURLにリダイレクトする以外に、特定のURLに制御を渡す方法はありますか?
  2. イベントパイプラインの後半でコードを再結合する方法はありますか?これは、1つのリクエストに対してのみイベントにバインドすることを意味すると思いますがApplication.PostAcquireRequestState、これはばかげているように聞こえます。
  3. セッション状態情報を早期に取得する方法はありますか?

もちろん、私はそれを完全に間違って行う方法についての提案を受け入れています。ああ、特にAsp.net/IISパイプライン用にそれをスローするためのより便利なタグを知っているなら、私は読み取りニシンではないタグを見つけることができませんでした。ありがとう!

4

1 に答える 1

1

ハンドラーを手動で呼び出すことはしたくないと思います...それはかなりハッキーに聞こえます。ここで301リダイレクトの代わりにServer.Transfer()を使用するのはどうですか?その後、ユーザー側で透過的になります。もちろん、見かけのURLが更新されないという欠点もありますが、何らかのリダイレクトが行われないと更新できませ

于 2012-11-05T18:59:26.057 に答える