2

現在、Web アプリの 404 エラー用のカスタム エラー ページを使用しています。リダイレクトが発生するaspxerrorpathと、ユーザーがアクセスしようとしていたパスが含まれます。Global.asax 内でエラーをキャッチしApplication_Error、リダイレクトが発生する前にクエリ文字列に新しいパラメーターを追加することは可能ですか? ユーザーが要求していたホストを追加したいと思います。

私の理解では、IIS は 404 リダイレクトを処理し、aspxerrorpathparam を 404 リダイレクトに追加します。これが発生する前にインターセプトし、クエリ文字列に別のパラメーターを追加したいと考えています。

詳細情報: CMS 内に複数のサイトがあるため、要求された URL は必ずしも ではありませんwww.example.comが、404 リダイレクトは常に になりwww.example.comます。

現在: ユーザーのリクエストwww.example.com/fakepage.aspxとリダイレクト先...

www.example.com/404.aspx?aspxerrorpath=/fakepage.aspx

私が欲しいもの:ユーザーのリクエストwww.example.com/fakepage.aspxとリダイレクト先...

www.example.com/404.aspx?aspxerrorpath=/fakepage.aspx&aspxerrorhost=example.com

解決策: カスタム HttpModule を実装することになりました (以下の回答を参照)。これを行う方法を説明する優れた記事を伝えたかっただけです。http://helephant.com/2009/02/11/improving-the-way-aspnet-handles-404-requests/

4

3 に答える 3

4

global.asaxファイルに次のコードを入れてみてください。

void Application_Error(object sender, EventArgs e)
{
    string host = Context.Request.Url.Host;
    string redirectUrl = string.Format("~/Error.html?aspxerrorpath={0}&aspxerrorhost={1}", Server.UrlEncode(Context.Request.Path), Server.UrlEncode(host));
    Response.Redirect(redirectUrl);
}

これは基本的に、エラーページにリダイレクトする独自のエラーハンドラーを作成します。これは、URLに任意のクエリパラメーターを追加できるため、より柔軟です。

この方法を使用するには、通常の方法でweb.configファイルでリダイレクトを構成することはできません。ただし、appSettingsファイルのセクションを使用して、次のように値を読み取ることはできます。

Web.configファイル

<appSettings>
  <add key="redirectPath" value="valueGoesHere"/>
</appSettings>

C#エラーハンドラ

string redirectPath = System.Configuration.ConfigurationManager.AppSettings["redirectPath"];

編集:

また、httpエラーコードに応じて別のページにリダイレクトする必要がある場合は、エラーハンドラで次のコードを使用します。

HttpException exception = Server.GetLastError() as HttpException;
int errorCode = -1;

if(exception != null)
{
    errorCode = exception.GetHttpCode();
}

switch (errorCode)
{
    case 404:
        // Redirect here
        break;
    default:
        // Redirect here
        break;
}
于 2012-07-09T14:41:23.947 に答える
1

エラーをトラップしてクエリを追加するには、IHttpHandler インターフェイスを継承して独自の HttpHandler を記述し、ProcessRequest メソッドにカスタム コードを追加する必要があります。

はい、これはすべてのリクエストに適用されますが、後のリクエストをトラップできます

方法についてはリンクを参照してください: MSDN

于 2012-07-09T13:45:45.160 に答える
0

おそらく、カスタムフィルター属性を使用することが解決策です(エラーが発生したかどうかを確認し、結果を変更するために OnActionExecuted を実装します)

于 2012-07-09T13:55:28.553 に答える