异步后流关闭

时间:2017-03-30 14:50:12

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

我有一个ASP.NET核心应用程序需要将流(由客户端发布的流)发送到Microsoft Cognitive Service以获取ID。然后将相同的流发送到azure blob进行备份,文件名应该是从Cognitive Service收到的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);
    }
}

我很困惑,有人能帮我解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

  

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