异步后流关闭

Stream closed after async

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

但似乎 MemoryStream ms 在被 faceServiceClient 使用后关闭了:在第二个 "ms.Position = 0" 声明 "Cannot access a closed stream" 时出现错误。

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

我很困惑,谁能帮我解决这个问题?

谢谢!

ms.Position = 0;//Error Here

要轻松修复它,您可以创建一个新的 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);
}