web-dev-qa-db-ja.com

ASP.net HTTP 404-MaxRequestLength例外の代わりにファイルが見つかりません

Webページにファイルアップロードコントロールがあります。リクエストの最大長は8 MB(maxRequestLength = 8192)。また、ファイルが4MBを超える場合にエラーをスローするサーバー検証もあります。構成に8MBあるのは、ユーザーに与えられるレバレッジであり、アプリケーションをテストできるようにするためでもあります。

9MBのファイルをアップロードすると、例外がスローされますリクエストの最大長を超えました。これは問題なく、期待どおりに機能しています。しかし、1GBのファイルをアップロードしようとすると、HTTP 404-ファイルが見つかりませんと表示されます。なぜこれが起こっているのか、そしてmaxRequestLength例外をスローさせるにはどうすればよいですか?

IIS6を使用しています。

44
Divi

今日この状態を経験しました(IIS 7を使用した大きなファイルのアップロードでHTTP 404))が、すべての構成設定を正しく行ったと思いました。最大300MBのファイルをアップロードしたかったので、次のようにしましたアプリケーションのサブフォルダーのweb.config設定:

<configuration>
    <system.web>
        <httpRuntime maxRequestLength="307200" />
    </system.web>
    <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="314572800" />
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

この構成はテストで機能しましたが、web.configを含む更新されたファイルを運用サーバーにコピーすると、90MBのファイルのアップロード時にHTTP 404エラーが発生しました。アプリケーション全体の制限である30MB未満の小さいファイルは正常に機能していたため、これが何らかの要求サイズの問題であることがわかりました。

IISが一部のアプリケーション設定をキャッシュし、それらを更新していなかった可能性があると思いましたしたがって、アプリケーションプールをリサイクルしました。その後、すべてが期待どおりに機能しました。

69
pseudocoder

私はここで答えがどれも説明しないように感じますなぜ404を取得します、彼らは問題を修正する方法の通常のものをあなたに話します。

404は設定ミスによるものではなく、 意図的で文書化された動作 です。

HTTPリクエストがリクエストの制限を超えたためにリクエストフィルタリングがHTTPリクエストをブロックすると、IIS 7はクライアントにHTTP 404エラーを返し、次のHTTPステータスのいずれかを一意のサブステータスでログに記録します。リクエストが拒否された理由:

 HTTPサブステータスの説明
 
 404.13コンテンツの長さが長すぎます
 404.14 URLが長すぎます
 404.15クエリ文字列が長すぎます

これらのサブステータスにより、Web管理者はIISログを分析し、潜在的な脅威を特定できます。

さらに、HTTPリクエストが<headerLimits>要素で定義されているヘッダー制限を超えると、IIS 7は次のサブステータスでHTTP 404エラーをクライアントに返します。

 HTTPサブステータスの説明
 
 404.10リクエストヘッダーが長すぎます
14
user247702

これは少し古いスレッドですが、これについての経験を追加する必要があると思いました。

大きなファイルのアップロードとWeb APIでも同じ問題に直面しました。コントローラに到達する前に404.13がスローされるため、どこにジャンプしてこのケースを処理するかを見つける必要がありました。

私の解決策は次のweb.configエントリでした:

私は404.13をmvcコントローラー(同じWebフォームページである可能性があります)にリダイレクトして処理し、通常の404エラーが404ルートにヒットします。 404.13のresponseMode = "redirect"が重要です

<httpErrors errorMode="Custom">
  <remove statusCode="404" subStatusCode="-1" />            
  <error statusCode="404" subStatusCode="13" path="/errors/filesize" responseMode="Redirect" />
  <error statusCode="404" path="/errors/notfound" responseMode="ExecuteURL" />      
</httpErrors>

次に、エラーコントローラーに次のようにします。

public ActionResult FileSize()
{
    Response.StatusCode = 500;
    Response.StatusDescription = "Maximum file size exceeded.";
    Response.End();
    return null;
}

繰り返しますが、これは通常のWebフォームページである可能性があります。

10
ScottE

私の知る限り、IISの "maxRequestLength"設定の超過を適切に処理する方法はありません。カスタムエラーページを表示することもできません(応答する対応するHTTPコードがないため)。これを回避する唯一の方法は、maxRequestLengthを非常に高いキロバイト数(たとえば、51200(50MB))に設定し、ファイルがアップロードされた後でContentLengthを確認することです(リクエストが90秒前にタイムアウトしなかった場合)。その時点で、ファイルが5MB以下かどうかを検証して、わかりやすいエラーを表示できます。

このリンク を試すこともできます。

次のようなことも試すことができます。

private void application_EndRequest(object sender, EventArgs e)
{
    HttpRequest request = HttpContext.Current.Request;
    HttpResponse response = HttpContext.Current.Response;

    if ((request.HttpMethod == "POST") &&
        (response.StatusCode == 404 && response.SubStatusCode == 13))
    {
        // Clear the response header but do not clear errors and transfer back to requesting page to handle error
        response.ClearHeaders();
        HttpContext.Current.Server.Transfer(request.AppRelativeCurrentExecutionFilePath);
    }
}
3
Scott

この問題は、URLScanツールがサイトにインストールされて実行されているときにIIS7(およびおそらくIIS6)でも発生する可能性があることを発見しました。

ファイルをウェブサイトにアップロードすると、「ファイルまたはディレクトリが見つかりません。探しているリソースが削除されたか、名前が変更されたか、一時的に利用できなくなっている可能性があります」というメッセージが表示されました。

問題の原因がURLScanである場合、ホスティングサーバー自体でサイトを参照しているときに大きなファイルをサイトにアップロードしようとすると、URLScanについて言及している404ではなく、完全なasp.netエラーメッセージが表示されます。 IISでWebサイトのISAPIフィルターを表示して、IIS7のサイトでURLScanが実行されているかどうかを確認することもできます。URLScanが使用されている場合は、そのリストが表示されます。

これは、URLScanのiniファイルを "%WINDIR%\ System32\Inetsrv\URLscan"に変更し、MaxAllowedContentLengthを変更することで修正できます。 MaxAllowedContentLengthはバイト単位です。

これを有効にするには、IIS再起動が必要な場合がありますが、IIS7で自分で試したときは再起動しませんでした。

http://www.iis.net/learn/extensions/working-with-urlscan/urlscan-overview

http://www.iis.net/learn/extensions/working-with-urlscan/common-urlscan-scenarios

1
wsys177

IIS自体にデフォルトのエラーページを設定できます。

0
user584539

リクエスト制限はIISの設定です。 IIS=)でサイトの[リクエストフィルタリング]セクションを開き、[リクエスト設定の編集]を選択します。私にとっては、それはとても簡単でした。

マイクロソフトからのより詳細なハウツー。

https://docs.Microsoft.com/en-us/iis/configuration/system.webserver/security/requestfiltering/#how-to-edit-the-request-filtering-feature-settings-and-request -limits

0
DarrenY