2010-11-17 9 views
14

Ho codice che accetta dati binari tramite POST e legge una matrice di byte. Per file di dimensioni superiori a 200 Kb, l'operazione non riesce. Ho controllato con il mio sysadmin (stiamo eseguendo IIS 7) per vedere se c'era un limite nella nostra configurazione e lui dice che non ce n'è, e sospetta che sia un problema con il codice. Qualcuno qui vede qualche potenziale problema? Qui è il mio codice:Request.BinaryRead (Request.TotalBytes) genera errore per file di grandi dimensioni

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 

Ecco l'errore che compare nei registri:

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> 

risposta

2

Se andate a leggere le specifiche del metodo BinaryRead, si vedrà che il parametro è in realtà un parametro out anche. Il metodo BinaryRead sta provando a cambiare il valore di Request.TotalBytes che non può fare. TotalBytes è di sola lettura.

Si può facilmente risolvere questo assegnando TotalBytes a una variabile e passando invece in. Questo è ciò che il codice di esempio mostra nella documentazione MSDN.

Se BinaryRead legge una quantità diversa di dati, la variabile rifletterà la dimensione della lettura.

+1

Ho usato frequentemente Request.BinaryRead (Request.TotalBytes) senza problemi. VBScript non genera un errore se si passa un parametro readoutly o costante a un parametro [out], ma crea semplicemente una memoria temporanea per il parametro al volo. – AnthonyWJones

+0

Ho modificato il codice per leggere myTotalBytes = Request.TotalBytes, quindi binData = Request.BinaryRead (myTotalBytes), ma ottengo lo stesso errore. – Adam

+0

Se si trattava di un problema di autorizzazione all'accesso TotalBytes, non avrebbe interessato solo i file superiori a 200k. Penso che la soluzione di Anthony sia più realistica. – castle1971

32

Per impostazione predefinita, il limite per la dimensione dell'entità in una richiesta POST è 200 K, quindi il tuo errore.

È possibile aumentare tale limite aprire Gestione IIS e spostarsi nell'albero nella propria applicazione. Fare doppio clic sull'icona "ASP" nel pannello principale. Espandi la categoria "Limiti". Modificare il "Maximum Requesting Entity Body Limit" su un valore maggiore.

Se questo è per un sito Web pubblico, fare attenzione al limite impostato, lo scopo del limite è impedire che i POST dannosi sovraccarichino il sito.

Problemi correlati