c# - ReadEntityBody 改变了行为

标签 c# asp.net

我有一个用作文件上传模块的 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.

所以如果换个角度来看,ReadEntityBodyStream.Read 有相同的API,应该也有相同的语义。从这个意义上说,4.5 (webengine4.dll) 只是改变了实现,同时仍然履行相同的契约(Contract)。

IMO,在最坏的情况下它是一个破坏性的变化,而在最好的情况下它是一个文档错误。有些人可能也不认为。你可以决定。

我没有动力去提交错误。如果它从第一天起就以这种方式工作,我可能会认为这是合乎逻辑的。遗憾的是它破坏了预期的 100% 向后兼容的框架更新。 C'est la vie..

关于c# - ReadEntityBody 改变了行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187094/

相关文章:

c# - 如何将字典绑定(bind)到 gridview?

c# - 寻找通过 SSIS 从安全 Web 服务使用数据的示例

javascript - 如何从 C# 更新 javascript 变量数组

c# - 如何在 asp.net mvc 中使用 {SiteName} 处理 [Authorize]

asp.net - 是否可以对某些收件人强制执行加密的 SMTP?

c# - FileVersionInfo.GetVersionInfo 显示替换文件的错误版本

c# - 这个 C# 对象初始化程序代码发生了什么?

asp.net - 无法向 session 状态服务器发出 session 状态请求?

c# - 如何使用 JavaScript 函数从 ASP.NET AJAX 控件工具包设置 slider 控件值?

asp.net - 如何直接从 Visual Studio 2008 部署 Web 应用程序?