gpt4 book ai didi

c# - 来自 response.Content.ReadAsStreamAsync() 的流不可随机读取

转载 作者:行者123 更新时间:2023-12-03 19:33:26 25 4
gpt4 key购买 nike

我正在制作一个 .Net Web API 应用程序,其中以下代码调用我的不同 c# 应用程序以下载文件,然后将其保存在磁盘上。有时一切正常,我得到了文件,但有时下面的代码无法读取流,我可以在其他应用程序中看到远程连接关闭异常。

public async Task<string> GetFilePathAsync(TestModel model)
{
string filePath = string.Empty;
var response = await cgRequestHelper.DownloadAsync(model);

if (response.IsSuccessStatusCode)
{
filePath = await SaveCgStreamAsync(cgResponse, serviceModel.FileName);
}
return filePath;
}

public async Task<HttpResponseMessage> DownloadAsync(TestModel model)
{
if (model == null)
throw new ArgumentNullException("model");
if (string.IsNullOrEmpty(model.Url))
throw new ArgumentNullException("Url");
if (model.Headers == null)
throw new ArgumentNullException("Headers");

HttpResponseMessage response;
using (HttpClient httpClient = new HttpClient())
{
foreach (var header in model.Headers)
{
httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
}
response = await httpClient.GetAsync(model.Url, HttpCompletionOption.ResponseHeadersRead);
}
return response;
}

public async Task<string> SaveCgStreamAsync(HttpResponseMessage response, string fileName)
{
if (response == null)
throw new ArgumentNullException("response");
if (string.IsNullOrEmpty(fileName))
throw new ArgumentNullException("fileName");

var filePath = _CreateTemporaryLocation(fileName);
Stream cgStream = null;
Stream fileStream = null;
try
{
cgStream = await response.Content.ReadAsStreamAsync();
fileStream = File.Open(filePath, FileMode.Create);
await cgStream.CopyToAsync(fileStream);
}
catch(Exception e)
{
throw;
}
finally
{
if(cgStream != null)
cgStream.Dispose();
if(fileStream != null)
fileStream.Dispose();
}

return filePath;
}

我在 Global.asax.cs 中设置了 ServicePointManager.DefaultConnectionLimit = 1000

在我当前的应用程序中,我在“await cgStream.CopyToAsync(fileStream);”上遇到异常尝试读取 cgStream 时的行。异常(exception)是“无法访问关闭的流”。带有空的内部异常
另一个应用程序异常是:
System.Web.HttpException: 远程主机关闭了连接。错误代码是 0x800703E3。
在 System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32 结果,Boolean throwOnDisconnect)
在 System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()
在 System.Web.HttpResponse.Flush(Boolean finalFlush, Boolean async)

平均而言,10 个请求中有 1 个因上述错误而失败。由于它是随机的,并不总是失败,因此很难解决问题。

以上代码是在以下人员的帮助下编写的: http://www.tugberkugurlu.com/archive/efficiently-streaming-large-http-responses-with-httpclient

任何与此问题相关的帮助表示赞赏!

谢谢

最佳答案

我想出了代码中的问题:
问题是我在“使用”中初始化 HttpClient 对象并在使用范围之外使用其响应。这将处理 HttpClient 对象,从而中断远程连接,这就是我无法流式传输内容的原因。随机行为是因为我们不知道对象何时会被释放,有时它不会在流之前被释放,有时它会被释放。

关于c# - 来自 response.Content.ReadAsStreamAsync() 的流不可随机读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40348278/

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