2010-11-17 12 views
14

Mam kod, który akceptuje dane binarne za pośrednictwem POST i czyta w tablicy bajtów. W przypadku plików większych niż 200 Kb operacja nie powiedzie się. Sprawdziłem z sysadminem (używamy IIS 7), aby sprawdzić, czy w naszej konfiguracji jest limit, a on mówi, że go nie ma i podejrzewa, że ​​jest to problem z kodem. Czy ktokolwiek tutaj widzi potencjalne problemy? Tu jest mój kodu:Request.BinaryRead (Request.TotalBytes) zgłasza błąd dla dużych plików

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 

tu jest błąd, który pojawia się w dziennikach:

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> 

Odpowiedz

2

Jeśli czytać specyfikację sposobu BinaryRead, widać, że parametr jest rzeczywiście się parametr także. Metoda BinaryRead próbuje zmienić wartość Request.TotalBytes, której nie może wykonać. TotalBytes jest tylko do odczytu.

Można to łatwo naprawić, przypisując wartość TotalBytes do zmiennej i przekazując ją w zamian. Oto przykładowy kod pokazany w dokumentacji MSDN.

Jeśli BinaryRead odczyta inną ilość danych, zmienna będzie odzwierciedlać rozmiar odczytu.

+1

Często używam Request.BinaryRead (Request.TotalBytes) bez problemu. VBScript nie wygeneruje błędu, jeśli przekażesz parametr "tylko do odczytu" lub "stały" do parametru [out], po prostu utworzy tymczasowe miejsce na przechowywanie parametru w locie. – AnthonyWJones

+0

Zmieniłem kod, aby odczytać myTotalBytes = Request.TotalBytes, następnie binData = Request.BinaryRead (myTotalBytes), ale nadal otrzymuję ten sam błąd. – Adam

+0

Jeśli był to problem z uprawnieniami dostępu do TotalBytes, nie miałby on wpływu tylko na pliki większe niż 200k. Myślę, że rozwiązanie Anthony'ego jest bardziej realistyczne. – castle1971

32

Domyślnie limit rozmiaru jednostki w żądaniu POST wynosi 200K, stąd błąd.

Możesz zwiększyć limit otwartego Menedżera usług IIS i nawigować po drzewie do swojej aplikacji. Kliknij dwukrotnie ikonę "ASP" na głównym panelu. Rozwiń kategorię "Limity". Zmodyfikuj "Maksymalny limit jednostki podmiotu wnioskującego" na większą wartość.

Jeśli ta strona jest przeznaczona dla publicznych stron internetowych, należy zachować ostrożność w wyznaczonym limicie, a celem tego ograniczenia jest zapobieganie przytłaczaniu stron POST.

Powiązane problemy