6

ファイルアップロードモジュールとして機能するHttpModuleがあり、.NET Frameworkを4.5にアップグレードすると、動作が異なります。フレームワーク4.0では、ReadEntityBodyメソッドは配列を256kで埋めましたが、アップグレード後は16kしか返しません。この問題を抱えている人は他にいますか?

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

        // ......
    }
4

2 に答える 2

1

私たちもこれに遭遇し、調整しなければなりませんでした。実際、本番環境では、多くの場合、16 KB 未満が返されることもわかっています。これは、おそらく、その環境で一度に使用できる容量が少ないためです。

個人的には、これを 4.5 のバグと見なしています。なぜなら、ReadEntityBodyの動作は、要求されたよりも少ない値を返すように文書化されていないためです。したがって、これは 4.0 から 4.5 への重大な変更です。

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

実装は、ストリームの終わりに達していない場合でも、要求されたよりも少ないバイト数を自由に返すことができます。

したがって、別の角度から見ると、ReadEntityBodyは と同じ APIStream.Readを持ち、同じセマンティクスを持つことが期待されます。その意味で、4.5 (webengine4.dll) は実装を変更しただけであり、同じ契約を満たしています。

IMO、最悪の場合は重大な変更ですが、せいぜいドキュメントのバグです。どちらでもないと考える人もいるかもしれません。あなたが決めることができます。

バグを報告する気になりませんでした。初日からこのように機能していれば、おそらく論理的であると考えていたでしょう。意図した 100% 下位互換性のあるフレームワークの更新で壊れてしまったのは残念です。C'est la vie..

于 2013-02-06T17:40:29.593 に答える
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);
    }
}
于 2013-02-13T10:17:21.970 に答える