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はデフォルトのままで問題は起きません。
属性デフォルト値説明
maxAllowedContentLength30000000要求内のコンテンツの最大長をバイト単位で指定します。
maxQueryString2048クエリ文字列の最大長をバイト単位で指定します。
maxUrl4096 URL の最大長をバイト単位で指定します。

Web.config の例

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を愛用
掲載日: 2012-03-21
iPentec all rights reserverd.