Geo*_*ond 42 c# azure azure-storage-blobs async-await azure-media-services
我试图使用Azure MediaService API与一起Azure Storage API在API 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)
可能有其他选择吗?
我无法告诉你为什么它不能正常工作。但我认为问题更可能出现在函数的构造中,而不是 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来防止死锁。
| 归档时间: |
|
| 查看次数: |
1820 次 |
| 最近记录: |