ASP.NETで28~30MB以上のファイルアップロードで404エラーが発生する - ASP.NET
ASP.NETで20MB程度のファイルはアップロードできるが、28~30MB以上のファイルがアップロードできないことがあります。
はじめに
ASP.NETではデフォルトで4MB以上のファイルのアップロードを制限する設定がされており、maxRequestLengthプロパティを設定することで、この制限を緩和できます。maxRequestLengthプロパティの設定は
こちらの記事を参照してください。
現象
IIS7.0では、maxRequestLengthプロパティの制限を緩和したにもかかわらず、28~30MB以上のファイルをアップロードすると404エラーが発生します。
原因
上記の現象は IIS7.0では、要求制限 "requestLimits"が新たに加えられており、この制限に該当するためエラーが発生します。要求制限 "requestLimits"の"maxAllowedContentLength"はデフォルトで30000000バイトになっており、約 28.6 MBに相当しています。
対処法
requestLimitsの制限を緩和するには以下のコードをWeb.configファイルに記述します。(下記の記述では120MBまでアップロード可能になります。)
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="120000000"/>
</requestFiltering>
</security>
</system.webServer>
maxAllowedContentLengthはバイト単位で指定します。
また、maxAllowedContentLength以外の制限もあり、下記のとおりです。よほど特殊な場合でない限り、maxQueryString,maxUrlはデフォルトのままで問題は起きません。
属性 | デフォルト値 | 説明 |
maxAllowedContentLength | 30000000 | 要求内のコンテンツの最大長をバイト単位で指定します。 |
maxQueryString | 2048 | クエリ文字列の最大長をバイト単位で指定します。 |
maxUrl | 4096 | URL の最大長をバイト単位で指定します。 |
Web.config の例
<?xml version="1.0"?>
<configuration>
<appSettings>
</appSettings>
<connectionStrings/>
<system.web>
<!--
認証されたユーザーで実行する
<identity impersonate="true" />
-->
<!--
デバッグ シンボルをコンパイルされたページに挿入するには、compilation debug="true"
に設定します。この設定はパフォーマンスに影響するため、開発時のみこの値を true に設定
してください。
-->
<compilation debug="true" targetFramework="4.0"></compilation>
<!--
最大アップロードサイズの設定
-->
<httpRuntime executionTimeout="90" maxRequestLength="1024000"
useFullyQualifiedRedirectUrl="false" minFreeThreads="8"
minLocalRequestFreeThreads="4" appRequestQueueLimit="100"/>
<!--
<customErrors> セクションは、要求の実行中にハンドルされていないエラーが発生した場合の処理方法の
構成を有効にします。具体的には、開発者が HTML エラー ページをスタック トレースのエラーの代わりに表示
するように構成することを可能にします。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
</system.web>
<system.codedom>
</system.codedom>
<!--
system.webServer セクションは、Internet Information Services 7.0 で ASP.NET AJAX を
実行するために必要です。以前のバージョンの IIS では不要です。
-->
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1048576000"/>
</requestFiltering>
</security>
</system.webServer>
</configuration>
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用