2013-01-06 12 views
6

Mam moduł HttpModule, który działa jako moduł przesyłania plików i po uaktualnieniu architektury .NET do wersji 4.5 działa inaczej. W wersji 4.0 metoda ReadEntityBody wypełniła tablicę 256k, ale po aktualizacji zwróci tylko 16k. Ktoś inny ma ten problem?ReadEntityBody zmieniło zachowanie

public void ProcessRequest(HttpContext context) 
    { 
     IServiceProvider provider = (IServiceProvider)context; 
     HttpWorkerRequest worker = (HttpWorkerRequest)provider.GetService(
      typeof(HttpWorkerRequest)); 

     byte[] data = new byte[256 * 1024]; 
     int readData = worker.ReadEntityBody(data, data.Length); 

     // ...... 
    } 

Odpowiedz

1

Wpadliśmy również na to i musieliśmy się dostosować. W rzeczywistości okazało się, że często mniej niż 16 KB może zostać zwróconych, prawdopodobnie dlatego, że w tym środowisku jest mniej dostępnych jednocześnie.

Osobiście patrzę na to jako błąd 4.5, ponieważ zachowanie ReadEntityBody nie zostało udokumentowane, aby zwrócić mniej niż wymagano, więc jest to zmiana zerwania z 4.0 na 4.5.

Z drugiej strony, Stream.Read robi udokumentować to zachowanie wyraźnie:

Implementacja może swobodnie powrócić mniej bajtów niż wymagane, nawet jeśli nie został osiągnięty koniec strumienia.

Więc jeśli spojrzeć na to z innej strony, ReadEntityBody ma taką samą API jako Stream.Read i należy oczekiwać, że mają takie same semantykę. W tym sensie, 4.5 (webengine4.dll) jedynie zmienił implementację, wciąż wypełniając tę ​​samą umowę.

IMO, w najgorszym przypadku jest to przełomowa zmiana, podczas gdy w najlepszym razie jest to błąd w dokumentacji. Niektórzy mogą to również uważać. Możesz zdecydować.

Nie czułem motywacji do zgłoszenia błędu. Gdyby działało w ten sposób od pierwszego dnia, prawdopodobnie uznałbym to za logiczne. To wstyd, że złamał się w zamierzonej 100% wstecznej aktualizacji ramowej. C'est la vie ..

0

W końcu znalazłem rozwiązanie tego problemu. Utworzono rozszerzenie klasy HttpWorkerRequestExtension, która wypełni bufor przed odebraniem połączenia.

public static class HttpWorkerRequestExtension 
{ 
    public static int ReadEntityBodyEx(this HttpWorkerRequest request, byte[] buffer, int offset, int size) 
    { 
     int bytesRead = 0; 
     int totalBytesRead = 0; 
     int bytesToRead = size; 

     while (bytesToRead > 0) 
     { 
      bytesRead = request.ReadEntityBody(buffer, offset + totalBytesRead, size - totalBytesRead); 

      if (bytesRead == 0) { break; } 

      bytesToRead -= bytesRead; 
      totalBytesRead += bytesRead; 
     } 

     return totalBytesRead; 
    } 

    public static int ReadEntityBodyEx(this HttpWorkerRequest request, byte[] buffer, int size) 
    { 
     return request.ReadEntityBodyEx(buffer, 0, size); 
    } 
} 
Powiązane problemy