gpt4 book ai didi

ASP.Net Web API : Send response before request body is read/uploaded

转载 作者:行者123 更新时间:2023-12-04 02:44:16 25 4
gpt4 key购买 nike

我在我的 Controller 上执行了一项操作,应该将大型 (500mb - 2gb) 文件上传到该 Controller 。例如,

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

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

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

如何避免这种情况?有没有办法阻止 IIS 将正文写入磁盘,并允许 Controller 处理流?令我沮丧的是,客户端开始上传和请求命中我自己的代码之间有 5 分钟的延迟,因为 ASP.Net 必须做自己的事情并将上传写入本地磁盘。


编辑

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

        /// <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);
}
}
}

最佳答案

您可以通过实现自定义 WebHostBufferPolicySelector

将 Web API 配置为在特定 Controller (或全局,就此而言)的无缓冲模式(流式传输)下工作
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);
}
}

我已经为 dealing large files in Web API 写了一个演练

关于ASP.Net Web API : Send response before request body is read/uploaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19168017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com