2013-01-06 14 views
6

私はファイルアップロードモジュールとして動作するHttpModuleを持っていますが、.NET Frameworkを4.5にアップグレードした後は、動作が異なります。フレームワーク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未満が返されることがあります。

個人的には、ReadEntityBodyの動作が要求されたものよりも少なくなるように文書化されていないため、これを4.5バグと見なします。

実装は、ストリームの終わりに達していない場合でも、要求されたよりも少ないバイト数を返すために自由である:一方

Stream.Readは、明示的にこの動作を文書化しません。

あなたは別の角度から見ればそう、ReadEntityBodyStream.Readと同じAPIを持ち、同じ意味を持つことが期待されなければなりません。その意味で、4.5(webengine4.dll)は、同じ契約を成し遂げながら実装を変更しただけです。

IMO、最悪の場合、それはドキュメントのバグですが、最悪の変更です。一部の人もそれを考慮しないかもしれません。あなたは決めることができます。

私はバグを報告する意欲は感じていません。それが1日目からこのように働いていれば、私はおそらく論理的だと考えていたでしょう。意図した100%の下位互換性のあるフレームワークアップデートで壊れたのは残念です。

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