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>
デフォルトでは、POSTリクエストのエンティティサイズの制限は200Kであるため、エラーが発生します。
その制限を増やすことができますopen IIS Managerを使用して、ツリーをアプリケーションに移動します。メインパネルの[ASP]アイコンをダブルクリックします。[制限]カテゴリを展開します。[最大要求エンティティ]を変更します。ボディリミット」をより大きな値に。
これが公開Webサイト用である場合、設定する制限に注意してください。制限の目的は、悪意のあるPOSTがサイトを圧倒するのを防ぐことです。
BinaryReadメソッドの仕様を読むと、パラメーターが実際にはoutパラメーターでもあることがわかります。 BinaryReadメソッドは、Request.TotalBytesの値を変更しようとしていますが、これはできません。 TotalBytesは読み取り専用です。
TotalBytesを変数に割り当て、代わりにそれを渡すことで、これを簡単に修正できます。これは、サンプルコードがMSDNドキュメントに示しているものです。
BinaryReadが異なる量のデータを読み取る場合、変数は読み取りのサイズを反映します。
IIS [制限のプロパティ]セクション]で2つの設定が必要
1- 最大要求エンティティボディ制限(バイト単位であることに注意してください)。最大ファイルサイズに応じて値を設定する必要があります(例:40MB(40000000バイト))。
2)-スクリプトタイムアウト。デフォルト値は「00:01:30:90秒です。コードの実行に必要な時間に応じて増やしてください。5分に設定すると問題は解決しました。