我有一个用作文件上传模块的 HttpModule,在将 .NET 框架升级到 4.5 后,它的工作方式有所不同。使用 framework 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);
// ......
}
最佳答案
我们也遇到过这个问题,不得不做出调整。事实上,在生产中,我们发现通常也可以返回少于 16 KB 的数据,这可能是因为在该环境中一次可用的数据较少。
我个人认为这是一个 4.5 错误,因为 ReadEntityBody 的行为没有记录返回少于请求,因此这是从 4.0 到 4.5 的重大更改。
另一方面,Stream.Read明确记录此行为:
An implementation is free to return fewer bytes than requested even if the end of the stream has not been reached.
所以如果换个角度来看,ReadEntityBody
和Stream.Read
有相同的API,应该也有相同的语义。从这个意义上说,4.5 (webengine4.dll) 只是改变了实现,同时仍然履行相同的契约(Contract)。
IMO,在最坏的情况下它是一个破坏性的变化,而在最好的情况下它是一个文档错误。有些人可能也不认为。你可以决定。
我没有动力去提交错误。如果它从第一天起就以这种方式工作,我可能会认为这是合乎逻辑的。遗憾的是它破坏了预期的 100% 向后兼容的框架更新。 C'est la vie..
关于c# - ReadEntityBody 改变了行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187094/