C# ReadEntityBody已更改行为
我有一个HttpModule作为文件上传模块,在将.netframework升级到4.5之后,它的工作方式就不同了。在Framework4.0中,ReadEntityBody方法将数组填充为256k,但在升级后,它将只返回16k。还有谁有这个问题吗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;
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);
}
}