gpt4 book ai didi

来自第 3 方的 C# 流响应,最小缓冲

转载 作者:行者123 更新时间:2023-12-03 07:38:30 27 4
gpt4 key购买 nike

我们的 ASP.NET MVC 端点充当另一个第 3 方 HTTP 端点的代理,该端点返回动态生成的约 400MB 的 XML 文档。

是否有一种方法可以让 ASP.NET MVC 通过“最小”缓冲将第三方响应直接“流”到我们端点的用户?

目前,看起来 ASP.NET System.Web.Mvc.Controller.File() 将整个文件加载到内存中作为响应。除了内存使用量的跳跃之外,不知道如何确认这一点?

System.Web.Mvc.Controller.File(

IIS AppPool 内存使用量增加了 400MB,稍后由垃圾收集回收。

如果我们能够通过“几乎直接”从传入响应流式传输来避免 System.Web.Mvc.Controller.File() 将整个 400MB 字符串加载到内存中,那就太好了,这可能吗?

模拟c# linqpad代码大致是这样的

public class MyResponseItem {
public Stream myStream;
public string metadata;
}

void Main()
{
Stream stream = MyEndPoint();

//now let user download this XML as System.Web.Mvc.FileResult
System.Web.Mvc.ActionResult fileResult = System.Web.Mvc.Controller.File(stream, "text/xml");
fileResult.Dump();
}

Stream MyEndPoint() {
MyResponseItem myResponse = GetStreamFromThirdParty("https://www.google.com");
return myResponse.myStream;
}

MyResponseItem GetStreamFromThirdParty(string fullUrl)
{
MyResponseItem myResponse = new MyResponseItem();
System.Net.WebResponse webResponse = System.Net.WebRequest.Create(fullUrl).GetResponse();
myResponse.myStream = webResponse.GetResponseStream();
return myResponse;
}

最佳答案

您可以通过不缓冲而直接将流复制到输出流来减少内存占用,这是一个快速的肮脏示例:

    public async Task<ActionResult> Download()
{
using (var httpClient = new System.Net.Http.HttpClient())
{
using (
var stream = await httpClient.GetStreamAsync(
"https://ckannet-storage.commondatastorage.googleapis.com/2012-10-22T184507/aft4.tsv.gz"
))
{
Response.ContentType = "application/octet-stream";
Response.Buffer = false;
Response.BufferOutput = false;
await stream.CopyToAsync(Response.OutputStream);
}
return new HttpStatusCodeResult(200);
}
}

如果您想进一步减少占用空间,可以使用 CopyToAsync(Stream, Int32) 重载设置较低的缓冲区大小,默认值为 81920 字节。

关于来自第 3 方的 C# 流响应,最小缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37536784/

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