ASP.Net Web API:在读取/上传请求正文之前发送响应

2024-05-12

我的控制器上有一个操作,应该上传大型(500mb - 2gb)文件。例如,

[HttpPost]
public void PostFile([FromUri]Guid uploadId)
{
  ...
}

在正文内部,执行一些检查(例如 uploadId 是否存在),然后将 HTTP 请求的发布正文写入磁盘(/网络共享)。

我以为我已经解决了这个问题,因为如果没有创建 uploadId,我可以通过抛出 HttpResponseException 几乎立即拒绝 HTTP 请求,但我刚刚发现即使在这种情况下,请求的主体也会完全上传到服务器并保存到磁盘的 ASP.Net Temporary Files 文件夹。这意味着客户端必须完全上传文件(大约需要 5-10 分钟)才能发现该文件已被服务器拒绝。

我该如何避免这种情况?有什么方法可以阻止 IIS 将主体写入磁盘并允许控制器处理流吗?我发现令人沮丧的是,客户端开始上传和请求命中我自己的代码之间有 5 分钟的延迟,因为 ASP.Net 必须做自己的事情并将上传写入本地磁盘。


EDIT

有人问我如何读取上传数据。本质上,使用这种方法:

        /// <summary>
        /// Saves the current request's upload stream to the proivded path.
        /// </summary>
        /// <param name="destinationPath">The path to save to.</param>
        /// <returns></returns>
        private async Task<FileInfo> SaveUploadToDiskAsync(string destinationPath)
        {
            using (var httpContent = Request.Content)
            {
                using (FileStream fileStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None, 8192, true))
                {
                    await httpContent.CopyToAsync(fileStream);

                    return new FileInfo(destinationPath);
                }
            }
        }

您可以通过实现自定义的方法将 Web API 配置为在特定控制器(或全局)的无缓冲模式(流式传输)下工作WebHostBufferPolicySelector

public class NoBufferPolicySelector : WebHostBufferPolicySelector
{
   public override bool UseBufferedInputStream(object hostContext)
   {
      var context = hostContext as HttpContextBase;

      if (context != null)
      {
         if (string.Equals(context.Request.RequestContext.RouteData.Values["controller"].ToString(), "upload", StringComparison.InvariantCultureIgnoreCase))
            return false;
      }

      return true;
   }

   public override bool UseBufferedOutputStream(HttpResponseMessage response)
   {
      return base.UseBufferedOutputStream(response);
   }
}

我已经写了一个演练在Web API中处理大文件 http://www.strathweb.com/2012/09/dealing-with-large-files-in-asp-net-web-api/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.Net Web API:在读取/上传请求正文之前发送响应 的相关文章

  • 隔离必需的字段验证器?

    我在页面上有两个搜索按钮 一个链接到下拉列表 另一个链接到带有文本框的下拉列表以获取更多搜索条件 我在所有上述控件上都需要现场验证器 当我从第一个下拉列表中选择某些内容并单击相应的搜索按钮时 文本框的字段验证器会触发 从而禁用第一个搜索按钮
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使
  • 使用 SimpleMembership 获取用户信息

    仍在尝试使用 MVC4 来掌握新的 SimpleMembership 我更改了模型以包含名字和姓氏 效果很好 我想更改登录时显示的信息 而不是在视图中使用 User Identity Name 我想做类似 User Identity For
  • 将列添加到新的数据行

    是否可以创建一个新的 DataRow 对象并在运行时向其中添加列 How can I specify column names for this data row object DataRow row new DataRow 不 DataR
  • 将 GUID 转换为整数并返回

    所以我有一个必须与之交互的第三方应用程序 该应用程序需要我的用户表中的用户ID 问题是我将我的 userID 存储为 GUID 而第 3 方应用程序仅接受整数 所以我想 如果有一种方法可以将 GUID 转换为整数 然后能够将其转换回来 当我
  • 读取 ASP.NET 中分块传输编码的 http 请求的正文

    J2ME 客户端正在使用分块传输编码发送 HTTP POST 请求 当 ASP NET 在 IIS6 和 WebDev exe server 中 尝试读取请求时 它将 Content Length 设置为 0 我想这没问题 因为加载请求时
  • IIS 中一次请求上传大文件时的内存使用情况

    我要使用 IIS7 8 在 ASP NET MVC 中实现一个网站 我需要上传大文件 几 GB 我知道我可以更改 web config 中的配置以上传最多 4GB 的文件 但我有点担心内存使用情况 如果我在一次请求中上传了一个3GB的文件
  • 执行多个查询时如何保持连接打开?

    我正在使用多个查询从应用程序中的同一服务器提取数据 问题是每次有新查询时我都必须打开一个新连接 是否有可能 打开连接 运行查询 拉取结果 运行另一个查询 拉取另一个结果 运行最终查询 拉取另一个结果 关闭连接 尽管您可能还不知道 但您的做法
  • 在机器密钥更改期间维护 ASP.Net 成员密码

    是否有实用程序或代码示例可以使用旧密钥解密 然后使用新密钥为 ASP Net 会员用户加密密码 提到的解决方法都不适合我 我的解决方案如下 它首先以明文形式存储密码 然后使用新的 MachineKey 再次对其进行重新加密 机器钥匙更换 h
  • 当 URL 包含 ASP.Net Core 参数的“+”时出现 404 错误

    当参数包含编码为空格的空格时 我的服务器返回 404 错误 代替 20 我不明白为什么 路线的形式为 Route Search PRM1 prm1 PRM2 prm2 PRM3 prm3 我的第一个问题是如何让服务器理解这种 URL htt
  • Microsoft MVC:手动触发表单验证

    有谁知道是否有办法手动触发 Net MVC 应用程序中的客户端表单验证 我想做以下事情 我已经查看了 MicrosoftMvcValidation js 中的代码 但没有找到可以在表单上调用的方法 我认为您正在寻找的验证可以在这里找到 ht
  • 在 MVC 2 编辑器模板中正确注册 JavaScript 和 CSS

    如何在 ASP NET MVC 2 RTM 编辑器模板中正确注册 javascript 块 我所处的具体场景是我想使用Dynach JSCal2 日期时间选择器 http www dynarch com projects calendar
  • appSettings 与 applicationSettings。应用程序设置已过时? [复制]

    这个问题在这里已经有答案了 我对在 web config 中保存设置的两种方法有一些疑问 应用程序设置 查看 web config
  • 调用 Web 服务时“请求失败,响应为空”

    从 aspx 页面调用服务器中托管的 Web 服务时 收到类似 请求失败 响应为空 的错误 我的页面中的代码 try HttpWebRequest request1 HttpWebRequest WebRequest Create http
  • Windows 共享主机 - 自定义计划任务

    我有一个 Windows 共享主机 我需要每天运行一些预定的 C 可执行文件来创建站点地图 发送新闻通讯等 提供商告诉我 出于安全原因 我无法运行可执行文件 我能做什么 提供商建议我购买 VPS 但认为仅仅为了运行一些计划任务而花更多钱是没
  • IE8 中的 Javascript 消息超出堆栈空间

    我正在使用 Breeze 1 4 1 Internet Explorer 8 和 ASP NET MVC 4 Web API 我在查询时收到以下消息 查询失败 localhost port breeze Data Metadata 元数据导
  • NServiceBus 3.2 示例问题

    我正在尝试运行 AsyncPages 的 NServiceBus 示例 看起来很简单 从 NServiceBus com 下载最新版本 执行bat文件来安装先决条件 打开解决方案 Press F5 在文本框中输入数字 当我这样做时 我遇到了
  • ACT by Sage 与 asp.net 集成 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 想知道这里是否有人可以提供帮助 我被要求开发一个 ASP Net 应用程序 它将直接连接 存储和检索 到 ACT 数据库已经正常运行
  • 如何在asp.net C#中从http重定向到https并将其设为网站的默认版本

    如何在asp net c 中从http重定向到https 我已经安装了https证书现在我想将https设置为我的网站的默认版本 iam使用windows server 2008 R2 asp net C 4 0 您是否正在寻找这样的东西
  • 如果用户可以解密 web.config,那么加密它有什么意义呢?

    哎呀 一些供应商告诉我的老板 不加密 web config 是一个很大的安全漏洞 这对我来说听起来像是废话 我的意思是 如果有人破坏了服务器 我们不是就完蛋了吗 就像 Joelt 所建议的那样 ASP NET 最近出现了一个安全问题 允许人

随机推荐