LoginSignup
1
1

More than 5 years have passed since last update.

ASP.NET 4.5 ストリーミング受信とアップロードサイズの制限

Posted at

この記事ではVisual Studio 2015のASP.NET 4.5.2 Webアプリケーションプロジェクトを使いました。

非同期ashxでストリーミングSaveAs

// System.Web.HttpTaskAsyncHandler
public override async Task ProcessRequestAsync(HttpContext context)
{
    using (var fs = File.OpenWrite("filename")) {
        await context.Request.GetBufferlessInputStream(disableMaxRequestLength:true).CopyToAsync(fs);
    }
}

ストリーミング受信

ASP.NETのパイプライン処理はヘッダーの受信が完了すれば始まる。しかしHttpRequest.InputStreamはリクエストBody全体が読み込まれるまでブロックする(このとき、一定の大きさ以上であれば一時ファイルにバッファリングされる)。

WebFormの場合はPageクラスがInputStreamへアクセスするのでユーザーコードが実行されるのはリクエスト全体の受信が完了した後になる。

HttpRequest.SaveAsは上記の仕組みによりいったんリクエスト全体が一時ファイルに保存されてそのファイルを読み出して再度ファイルに保存される。

.NET4からHttpRequest.GetBufferlessStreamメソッドが用意された。リクエスト全体の受信完了を待たずに処理をすることができる。

受信サイズの制限

アップロードのサイズ制限

  1. requestFiltering/requestLimits@maxAllowContentLength1
    IISの機能。web.configのlocation要素を使って特定のパスにだけ適用することができる。

  2. httpRuntime@maxRequestLength2
    ASP.NETの機能。アプリケーションルートでのみ指定でき、アプリケーション全体で有効になる。

v4.5で追加されたHttpRequest.GetBufferlessInputStream(disableMaxRequestLength:true)3HttpRuntime@maxRequestLengthの制限を受けない。

アップロードされたファイルの一時保存先
ASP .NET Ajax File Upload
数GBのファイルをHTTPでPOSTできるか- (2) サーバー編 - @jsakamoto
数GBのファイルをHTTPでPOSTできるか? (3) 完結

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1