web-dev-qa-db-ja.com

Request.BinaryRead(Request.TotalBytes)は、大きなファイルに対してエラーをスローします

POSTを介してバイナリデータを受け入れ、バイトの配列を読み取るコードがあります。200Kbを超えるファイルの場合、操作は失敗します。システム管理者に確認しました(実行中= IIS 7)構成に制限があったかどうかを確認し、制限がないと言って、コードに問題があると考えています。ここにいる誰かが潜在的な問題を見つけていますか?これが私のコードです:

Public Sub Initialize
  If Request.TotalBytes > 0 Then
    Dim binData
      binData = Request.BinaryRead(Request.TotalBytes) ' This line fails'
      getData binData
  End If
End Sub


 Private Sub getData(rawData)
    Dim separator 
      separator = MidB(rawData, 1, InstrB(1, rawData, ChrB(13)) - 1)

    Dim lenSeparator
      lenSeparator = LenB(separator)

    Dim currentPos
      currentPos = 1
    Dim inStrByte
      inStrByte = 1
    Dim value, mValue
    Dim tempValue
      tempValue = ""

    While inStrByte > 0
      inStrByte = InStrB(currentPos, rawData, separator)
      mValue = inStrByte - currentPos

      If mValue > 1 Then
        value = MidB(rawData, currentPos, mValue)

        Dim begPos, endPos, midValue, nValue
        Dim intDict
          Set intDict = Server.CreateObject("Scripting.Dictionary")

          begPos = 1 + InStrB(1, value, ChrB(34))
          endPos = InStrB(begPos + 1, value, ChrB(34))
          nValue = endPos

        Dim nameN
          nameN = MidB(value, begPos, endPos - begPos)

        Dim nameValue, isValid
          isValid = True

          If InStrB(1, value, stringToByte("Content-Type")) > 1 Then

            begPos = 1 + InStrB(endPos + 1, value, ChrB(34))
            endPos = InStrB(begPos + 1, value, ChrB(34))

            If endPos = 0 Then
              endPos = begPos + 1
              isValid = False
            End If

            midValue = MidB(value, begPos, endPos - begPos)
              intDict.Add "FileName", trim(byteToString(midValue))

          begPos = 14 + InStrB(endPos + 1, value, stringToByte("Content-Type:"))
          endPos = InStrB(begPos, value, ChrB(13))

            midValue = MidB(value, begPos, endPos - begPos)
              intDict.Add "ContentType", trim(byteToString(midValue))

            begPos = endPos + 4
            endPos = LenB(value)

            nameValue = MidB(value, begPos, ((endPos - begPos) - 1))
          Else
            nameValue = trim(byteToString(MidB(value, nValue + 5)))
          End If

          If isValid = True Then

            intDict.Add "Value", nameValue
            intDict.Add "Name", nameN

            dict.Add byteToString(nameN), intDict
          End If
      End If

      currentPos = lenSeparator + inStrByte
    Wend
  End Sub

ログに表示されるエラーは次のとおりです。

Log Name:      Application    
Source:        Active Server Pages    
Date:          11/11/2010 2:15:35 PM    
Event ID:      5    
Task Category: None    
Level:         Error    
Keywords:      Classic    
User:          N/A    
Computer:      xxxxx.xxxxx.xxx    
Description:    
Error: File /path-to-file/loader.asp Line 36 Operation not Allowed. .    
Event Xml:    
<Event xmlns="http://schemas.Microsoft.com/win/2004/08/events/event">    
  <System>    
    <Provider Name="Active Server Pages" />    
    <EventID Qualifiers="49152">5</EventID>    
    <Level>2</Level>    
    <Task>0</Task>    
    <Keywords>0x80000000000000</Keywords>    
    <TimeCreated SystemTime="2010-11-11T19:15:35.000Z" />    
    <EventRecordID>19323</EventRecordID>    
    <Channel>Application</Channel>    
    <Computer>PHSWEB524.partners.org</Computer>    
    <Security />    
  </System>    
  <EventData>    
    <Data>File /mghdev/loader.asp Line 36 Operation not Allowed. </Data>    
  </EventData>    
</Event>
16
Adam

デフォルトでは、POSTリクエストのエンティティサイズの制限は200Kであるため、エラーが発生します。

その制限を増やすことができますopen IIS Managerを使用して、ツリーをアプリケーションに移動します。メインパネルの[ASP]アイコンをダブルクリックします。[制限]カテゴリを展開します。[最大要求エンティティ]を変更します。ボディリミット」をより大きな値に。

これが公開Webサイト用である場合、設定する制限に注意してください。制限の目的は、悪意のあるPOSTがサイトを圧倒するのを防ぐことです。

36
AnthonyWJones

BinaryReadメソッドの仕様を読むと、パラメーターが実際にはoutパラメーターでもあることがわかります。 BinaryReadメソッドは、Request.TotalBytesの値を変更しようとしていますが、これはできません。 TotalBytesは読み取り専用です。

TotalBytesを変数に割り当て、代わりにそれを渡すことで、これを簡単に修正できます。これは、サンプルコードがMSDNドキュメントに示しているものです。

BinaryReadが異なる量のデータを読み取る場合、変数は読み取りのサイズを反映します。

2
Adam Dymitruk

IIS [制限のプロパティ]セクション]で2つの設定が必要

1- 最大要求エンティティボディ制限(バイト単位であることに注意してください)。最大ファイルサイズに応じて値を設定する必要があります(例:40MB(40000000バイト))。

2)-スクリプトタイムアウト。デフォルト値は「00:01:30:90秒です。コードの実行に必要な時間に応じて増やしてください。5分に設定すると問題は解決しました。

1
Ulfat Hussain