Request.BinaryRead(Request.TotalBytes) выдает ошибку для больших файлов

У меня есть код, который принимает двоичные данные через POST и читает в массиве байтов. Для файлов размером более 200 КБ операция завершается с ошибкой. Я проверил с моим sysadmin (мы запускаем 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>

Ответы

Ответ 1

По умолчанию ограничение размера сущности в запросе POST составляет 200 тыс., следовательно, ваша ошибка.

Вы можете увеличить этот лимит, откройте диспетчер IIS и переместите дерево в свое приложение. Дважды щелкните значок "ASP" на главной панели. Разверните категорию "Ограничения". Измените "Максимальный размер тела запрашивающего лица" на большее значение.

Если это для общедоступного веб-сайта, будьте осторожны в отношении установленного вами предела, цель ограничения - предотвратить попадание вредоносных POST на сайт.

Ответ 2

Если вы прочитаете спецификации метода BinaryRead, вы увидите, что этот параметр также является параметром out. Метод BinaryRead пытается изменить значение Request.TotalBytes, которое он не может сделать. TotalBytes доступен только для чтения.

Вы можете легко исправить это, назначив TotalBytes переменной и передав это вместо. Это пример кода в документации MSDN.

Если BinaryRead читает другой объем данных, переменная будет отображать размер прочитанного.

Ответ 3

В IIS требуются две настройки в разделе "Свойства лимита" 1- Максимальный лимит запрашиваемого тела сущности (не в байтах). Вы должны установить значение в соответствии с вашим максимальным размером файла, например, 40 МБ (40000000 байт). 2) - Время ожидания сценария. Его значение по умолчанию: "00:01:30: 90 секунд. Увеличьте его в соответствии с временем, необходимым для выполнения вашего кода. Я установил его на 5 минут, и это решило проблему.