【问题标题】:Stream closed after async异步后流关闭
【发布时间】:2017-08-24 13:55:46
【问题描述】:

我有一个 ASP.NET 核心应用程序,需要向 Microsoft 认知服务发送流(流由客户端发布)以获取 ID。然后将相同的流发送到azure blob进行备份,文件名应该是从认知服务接收到的ID。

但在 faceServiceClient 使用后,MemoryStream ms 似乎已关闭:在第二个“ms.Position = 0”语句中出现错误,即“无法访问已关闭的流”。

public static async Task CreatPerson(string _key, HttpRequest _req)
{
    var faceServiceClient = new FaceServiceClient(_key);
    using (MemoryStream ms = new MemoryStream())
    {
        _req.Body.CopyTo(ms);
        ms.Position = 0;
        var facesTask = faceServiceClient.AddFaceToFaceListAsync("himlens", ms);
        //init azure blob
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(AZURE_STORE_CONN_STR);
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference("xxx");
        var faces = await facesTask;
        var blob = container.GetBlockBlobReference(faces.PersistedFaceId.ToString());

        ms.Position = 0;//Error Here
        await blob.UploadFromStreamAsync(ms);
    }
}

我对此感到困惑,有人可以帮我解决这个问题吗?

谢谢!

【问题讨论】:

  • AddFaceToFaceListAsync 是否会关闭流?无论如何,如果您打算将流的数据传递给多个方法,请提取缓冲区并将其传递给方法,而不是尝试更改流的位置。最后,您不应该在任务中使用.Wait().Result。最后一行应该是await blob.UploadFromStreamAsync(ms);

标签: c# asp.net azure stream asp.net-core-webapi


【解决方案1】:

ms.Position = 0;//此处出错

要轻松修复它,您可以创建一个新的 MemoryStream 实例并从 ms 复制值。然后您可以将其上传到您的 blob 存储。以下代码供您参考。

using (MemoryStream ms = new MemoryStream())
{
    _req.Body.CopyTo(ms);
    ms.Position = 0;
    //new code which I added 
    MemoryStream ms2 = new MemoryStream();
    ms.CopyTo(ms2);
    ms.Position = 0;

    var facesTask = faceServiceClient.AddFaceToFaceListAsync("himlens", ms);
    //init azure blob
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(AZURE_STORE_CONN_STR);
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference("xxx");
    var faces = await facesTask;
    var blob = container.GetBlockBlobReference(faces.PersistedFaceId.ToString());
    //Code which I modified
    ms2.Position = 0;
    await blob.UploadFromStreamAsync(ms2);
}

【讨论】:

  • 谢谢你的帮助,但是还有一个问题是什么时候
  • 新问题是什么?您是否将 ms2 上传到 azure blob 存储?由于 ms2 和 ms 是不同的流。任何影响 ms 的更改都不会与 ms2 相关。
  • 我很抱歉在尝试解决该问题时错过了该提交。问题是除非我杀死程序,否则ms2将无法刷新,然后我添加一个“ms2.Flush();”,它的功能非常好。非常感谢您帮助我!
猜你喜欢
  • 2011-01-07
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
相关资源
最近更新 更多