1

IIS 7(クラシックモード)で「見つからない」要求とコードでスローされた404HttpExceptionsの両方を処理するユニバーサル.NET3.5ASPX404エラーページを実装しようとしています。リダイレクトではなく真の404リターンコードが必要なため、customErrorsを回避しています。

これを行うために、web.configのsystem.webserverセクションに以下を追加しました。

<httpErrors>
  <remove statusCode="404" subStatusCode="-1" />
  <error statusCode="404" subStatusCode="-1" path="/virtualdir/errorpages/error404.aspx" responseMode="ExecuteURL" prefixLanguageFilePath="" />
</httpErrors>

また、Global.asax Application_ErrorにServer.Transfer呼び出しを追加して、コードでスローされた例外をキャプチャしました。

問題は、相対パス(app_themesやリンクなど)が、元のリクエストのURLではなく、エラーページを基準にして計算されることです。

したがって、/ virtualdir / fail / fail / fail / fail / fail.htmlのリクエストは、/ virtualdir / fail / fail / fail/app_themesでapp_themesを見つけようとします。

Request.RawUrlを含む解決策があるかもしれないと思いますが、まだ見つけていません。

私がこの問題を抱えている最初の人になることはできないと確信していますが、私のGoogleFuは今回私を失望させました。

編集

私はいくつかの調査を行いましたが、さまざまな状況下で、障害のあるURLがRequest.URLプロパティに保持されるか(望ましい)、クエリ文字列の一部としてエラーページのURLに(/virtualdir/errorpages/error404.aspx)の形式で追加されます?404; http://host/virtualdir/fail/fail/fail/fail/fail.html)。

私のIIS6ローカルボックスでは、ASPXエラーは前者の方法で機能し、IIS 7テストボックスでは、ASPXページは後者の方法を使用します。

4

2 に答える 2

1

これが私の解決策です:

string queryString = Request.Url.Query;
if (queryString.StartsWith("?404;"))
{
    try
    {
        Uri newUri = new Uri(queryString.Replace("?404;", String.Empty));

        HttpContext.Current.RewritePath(newUri.PathAndQuery);
    }
    catch (UriFormatException)
    {
        // Do nothing, the query string is malformed.
    }
}

ちょっと汚い感じですが。私は宣言的な解決策を望んでいます。

于 2011-01-24T12:47:37.950 に答える
0

今はテストできませんが、チルダを使用して URL をアプリ相対にすることは試しましたか? 例えば:

<error statusCode="404" subStatusCode="-1" path="~/errorpages/error404.aspx" responseMode="ExecuteURL" prefixLanguageFilePath="" />
于 2011-01-22T16:33:34.130 に答える