我的代码通过POST接受二进制数据并读入一个字节数组。对于大于200 Kb的文件,操作失败。我已经检查了我的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>
答案 0 :(得分:33)
默认情况下,POST请求中实体大小的限制为200K,因此您的错误。
您可以增加该限制,打开IIS管理器并将树导航到您的应用程序。双击主面板中的“ASP”图标。展开“限制”类别。将“最大请求实体主体限制”修改为更大的值。
如果这是针对公共网站,请注意您设置的限制,限制的目的是防止恶意POST压倒网站。
答案 1 :(得分:2)
如果您阅读了BinaryRead方法的规范,您将看到该参数实际上也是一个out参数。 BinaryRead方法正在尝试更改它无法执行的Request.TotalBytes的值。 TotalBytes是只读的。
您可以通过将TotalBytes分配给变量并将其传递给变量来轻松解决此问题。这是示例代码在MSDN文档中显示的内容。
如果BinaryRead读取不同数量的数据,该变量将反映读取的大小。
答案 2 :(得分:0)
IIS中“限制属性”部分下需要两个设置
1- 最大请求实体正文限制(请不要以字节为单位)。您必须根据最大文件大小e-g- 40MB(40000000字节)设置该值。
2)-脚本超时。默认值为“ 00:01:30:90秒。根据您的代码运行所需的时间增加它。我将其设置为5分钟,这样就解决了问题。