2013-01-06 73 views
6

我有一個HttpModule充當文件上傳模塊,並將.NET框架升級到4.5後,它的工作方式不同。在Framework 4.0中,ReadEntityBody方法用256k填充數組,但在升級之後它將只返回16k。任何其他人有這個問題?ReadEntityBody已更改行爲

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); 

     // ...... 
    } 

回答

1

我們也遇到過這個問題,不得不進行調整。實際上,在生產環境中,我們發現通常可以返回少於16 KB的數據,這可能是因爲在該環境中一次只能使用較少的數據。

就我個人而言,我將此視爲4.5錯誤,因爲ReadEntityBody的行爲沒有記錄爲返回小於請求的行爲,所以這是從4.0到4.5的突變。

在另一方面,Stream.Read不明確記錄此行爲:

的實現可自由地返回比,即使尚未達到要求的流的末尾更少的字節。

所以,如果你從另一個角度看,ReadEntityBody具有相同的API Stream.Read,應該預計將有相同的語義。從這個意義上講,4.5(webengine4.dll)只是改變了實現,同時仍然履行了同樣的合同。

國際海事組織,在最壞的情況下,這是一個突破性的變化,而充其量也是一個文件錯誤。有些人可能認爲它不是。你可以決定。

我沒有覺得有動機提出錯誤。如果它從第一天開始這樣工作,我可能會認爲它是合乎邏輯的。這是一個恥辱,它打破了預期的100%向後兼容的框架更新。 C'est la vie ..

0

最後我找到了解決這個問題的方法。爲返回呼叫之前填充緩衝區的HttpWorkerRequestExtension類創建擴展。

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); 
    } 
}