C# ReadEntityBody已更改行为

C# ReadEntityBody已更改行为,c#,asp.net,C#,Asp.net,我有一个HttpModule作为文件上传模块,在将.netframework升级到4.5之后,它的工作方式就不同了。在Framework4.0中,ReadEntityBody方法将数组填充为256k,但在升级后,它将只返回16k。还有谁有这个问题吗 public void ProcessRequest(HttpContext context) { IServiceProvider provider = (IServiceProvider)context;

我有一个HttpModule作为文件上传模块,在将.netframework升级到4.5之后,它的工作方式就不同了。在Framework4.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);

        // ......
    }

我们也遇到了这种情况,不得不进行调整。事实上,在生产中,我们发现通常也可以返回小于16KB的数据,这可能是因为在该环境中一次可用的数据较少

就我个人而言,我将其视为4.5错误,因为的行为没有记录为返回的少于请求的,因此这是从4.0到4.5的突破性更改

另一方面,是否明确记录了此行为:

即使尚未到达流的结尾,实现也可以自由返回比请求的字节更少的字节

因此,如果从另一个角度来看,
ReadEntityBody
Stream.Read
具有相同的API,应该具有相同的语义。从这个意义上讲,4.5(webengine4.dll)只是在履行相同契约的同时更改了实现

依我看,最坏的情况下,这是一个突破性的变化,而最好的情况下,这是一个文档错误。有些人可能不这么认为。你可以决定


我还没有意识到有什么动机去提交一个bug。如果从第一天开始就这样,我可能会认为这是合乎逻辑的。令人遗憾的是,它打破了预期的100%向后兼容的框架更新。我终于找到了解决这个问题的办法。为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);
    }
}