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

我正在制作一个.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时显示一行。例外是“无法访问封闭的流”。 InnerException为null
另一个应用程序异常是:
System.Web.HttpException:远程主机关闭了连接。错误代码为0x800703E3。
在System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32结果,布尔throwOnDisconnect)
在System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()
在System.Web.HttpResponse.Flush(Boolean finalFlush,布尔异步)

平均而言,十分之一的请求失败,并出现上述错误。由于它是随机的,并不总是失败,因此很难解决问题。

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

任何与此问题有关的帮助,我们将不胜感激!

谢谢

参考方案

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

需要从the_content()获取所有<img>;在WordPress中? - php

我最近刚从博客网站将所有内容导入到wordpress中,我需要整理一些东西。我正在single.php中工作,我想从<a><img src=""/></a>获取每个the_content();。我的php充其量是一点伪劣。我知道这是发布该帖子的第一张图片,但是我需要类似的内容,它可以将the_conte…

在将泛型引用类型与泛型类型一起使用时收到警告 - c#

我有一个类似于以下的泛型类型,它带有一个名为ExecuteAsync()的方法,该方法可以返回一个对象或null: public interface IStoredProcedure<Result, Schema> where Result : IBaseEntity where Schema : IBaseSchema { Task<Re…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…

LeetCode题解黑白圆盘

一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可