【问题标题】:MultipartFormDataStreamProvider vs HttpContext.CurrentMultipartFormDataStreamProvider 与 HttpContext.Current
【发布时间】:2013-07-31 19:28:02
【问题描述】:

当我可以使用 HttpContext.Current 获取所有信息时,我很难理解为什么要使用 MultipartFormDataStreamProvider。

这样做要容易得多:

var mydata = HttpContext.Current.Request.Form["mydata"];

比这个:

string root = HttpContext.Current.Server.MapPath("~/somedir");
var provider = new MultipartFormDataStreamProvider(root);

this.Request.Content.ReadAsMultipartAsync(provider).ContinueWith(t =>
{
    var mydata = provider.Contents.First(c => c.Headers.ContentDisposition.Name == "\"mydata\"").ReadAsStringAsync().Result;
});

PS - 我正在尝试构建一个 ApiController 来接受文件上传。我读过这篇文章http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-2

【问题讨论】:

  • 一个原因是能够异步读取内容。
  • 另一个原因是这在自托管场景中不起作用,因为您依赖于HttpContext.Current
  • 不幸的是,在使用 WebAPI 时使用此方法需要将文件写入指定路径中的磁盘。没有官方文档说明写入的内容、原因或表明应用程序负责删除之后的文件。考虑到文件已经在流中,会有很多开销。
  • HttpContext.Current 是整体 System.Web 的一部分,它会在 ASP.NET 的未来版本中消失。 Web API 旨在与 ASP.NET vNext 向前兼容。
  • HttpContext.Current 在单元测试中也不起作用,您可以使用 OWIN 的 TestServer

标签: .net asp.net-web-api


【解决方案1】:

这是我在MSDN 上找到的。我想这可能会对你有所帮助。

流提供程序查看 Content-Disposition 标头字段并根据 filename 参数的存在确定输出 Stream。如果 Content-Disposition 标头字段中存在 filename 参数,则正文部分将写入 FileStream,否则将写入 MemoryStream。这使得处理 MIME 多部分 HTML 表单数据变得很方便,它是表单数据和文件内容的组合。

【讨论】:

  • 您能举个例子,使用 HttpClient 同时发布文件和表单数据吗?
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多