2010-11-17 13 views
14

Tengo código que acepta datos binarios a través de POST y lee en una matriz de bytes. Para archivos de más de 200 Kb, la operación falla. He consultado con mi administrador de sistemas (estamos ejecutando IIS 7) para ver si había un límite en nuestra configuración y él dice que no hay ninguno, y sospecha que es un problema con el código. ¿Alguien aquí ve algún problema potencial? Aquí está mi código:Request.BinaryRead (Request.TotalBytes) arroja el error para archivos grandes

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 

aquí es el error que aparece en los registros:

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> 

Respuesta

2

Si usted lee las especificaciones del método BinaryRead, se verá que el parámetro es en realidad un parámetro de salida también. El método BinaryRead está intentando cambiar el valor de Request.TotalBytes que no puede hacer. TotalBytes es de solo lectura.

Puede solucionarlo fácilmente asignando TotalBytes a una variable y pasándola en su lugar. Esto es lo que muestra el código de ejemplo en la documentación de MSDN.

Si el BinaryRead lee una cantidad diferente de datos, la variable reflejará el tamaño de la lectura.

+1

He utilizado con frecuencia Request.BinaryRead (Request.TotalBytes) sin problemas. VBScript no arrojará un error si pasa un valor de solo lectura o constante a un parámetro [out], simplemente crea un almacenamiento temporal para el parámetro sobre la marcha. – AnthonyWJones

+0

Cambié por código para leer myTotalBytes = Request.TotalBytes, luego binData = Request.BinaryRead (myTotalBytes), pero sigo recibiendo el mismo error. – Adam

+0

Si se tratara de un problema de permiso de acceso TotalBytes, no habría afectado solo a archivos de más de 200k. Creo que la solución de Anthony es más realista. – castle1971

32

De forma predeterminada, el límite para el tamaño de entidad en una solicitud POST es 200K, de ahí su error.

Puede aumentar ese límite abra el Administrador de IIS y navegue por el árbol hasta su aplicación. Haga doble clic en el ícono "ASP" en el panel principal. Expande la categoría "Límites". Modifique el "Límite máximo del cuerpo de la entidad solicitante" a un valor mayor.

Si esto es para un sitio web público, tenga cuidado con el límite establecido, el objetivo es evitar que los POST maliciosos abrumen el sitio.

Cuestiones relacionadas