尝试创建资产时出现System.NotSupportedException

Geo*_*ond 42 c# azure azure-storage-blobs async-await azure-media-services

我试图使用Azure MediaService API与一起Azure Storage APIAPI Service中主持Azure.

用户将视频流发送到服务HttpPost,服务将视频保存为我的存储帐户中的blob,媒体服务对视频进行编码,当视频链接准备就绪时,将其返回给用户.

但是,当我试图创建Asset一个System.NotSupportedException被抛出与消息:

抛出异常:Microsoft.Data.Services.Client.dll中的'System.NotSupportedException'抛出异常:mscorlib.dll中的'System.NotSupportedException'iisexpress.exe错误:0:Exception = System.NotSupportedException:此目标框架不支持您直接枚举数据服务查询.这是因为枚举会自动向数据服务发送同步请求.由于此框架仅支持异步操作,因此必须调用BeginExecute和EndExecute方法来获取支持枚举的查询结果.

我使用以下版本的所需依赖项:

Microsoft.Data.Services.Client - 5.6.2.0
Microsoft.WindowsAzure.MediaServices.Client - 3.0.0.8
Microsoft.WindowsAzure.Storage - 3.1.0.1
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

CloudMediaContext _context;
IAsset asset;
using (MemoryStream Ms = new MemoryStream(data.Data))
{
    _context = new CloudMediaContext("accountName", "accountKey");
    asset = await _context.Assets.CreateAsync("blobContainerName",
        AssetCreationOptions.None,CancellationToken.None);
    ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

data.Data包含byte[]视频.CreateAsync调用时抛出异常.我试着_context.Assets.Create没有运气.

重要编辑

我创建了一个新的控制台应用程序,使用了我在API服务中使用的代码并且它已成功执行.所以问题出在API服务中.

这是我的类和方法定义

public class UploadController : ApiController
{

    [HttpPost]
    public async Task<string> PostUpload(VideoData data)
    {
        ...
        ...
    }
Run Code Online (Sandbox Code Playgroud)

可能有其他选择吗?

Sma*_*tis 0

我无法告诉你为什么它不能正常工作。但我认为问题更可能出现在函数的构造中,而不是 Azure API 中。

应该这样做:

    // Important is the return value of the function: 
    public async Task<IAsset> CreateAssetBlobAsync(CancellationToken token)
    {            
        var asset = await _context.Assets.CreateAsync("blobContainerName", AssetCreationOptions.None, CancellationToken.None); // or your 'token'

        return asset;
    }
Run Code Online (Sandbox Code Playgroud)

这个异步函数应该这样调用:

public static async Task ProcessNewBlobAsync()
{
     // ...

     var asset = await CreateAssetBlobAsync(token);

     // ...
}
Run Code Online (Sandbox Code Playgroud)

我认为问题出在你的using声明上

事实上,这些Read/Write Async方法MemoryStream实际上并不提供任何类型的真正的异步实现。这意味着它们始终是同步的。

(但是你没有调用它们中的任何一个。我担心它可能是异步方法的同步包装器。因此它会同步调用 API,而不是异步。这只是一个想法。)

我建议避免使用语句 withasync防止死锁