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 минут, и это решило проблему.