繁体   English   中英

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

[英]System.NotSupportedException when trying to create an asset

我试图在Azure托管的API Service中使用Azure MediaService APIAzure Storage API

用户将视频流作为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

这是我的代码:

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

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

重要编辑

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

这是我的类和方法定义

public class UploadController : ApiController
{

    [HttpPost]
    public async Task<string> PostUpload(VideoData data)
    {
        ...
        ...
    }

可能有其他选择吗?

我能够使用.NET 4.6.1和以下nuget包创建一个工作演示:

[HttpPost]
public async Task<string> PostUpload()
{
    var bytes = System.Text.Encoding.UTF8.GetBytes("Test");
    var data = new VideoData { Data = bytes };
    CloudMediaContext _context;
    using (MemoryStream ms = new MemoryStream(data.Data))
    {
        var accountName = "accountName";
        var accountKey = @"primaryaccessKey";
        _context = new CloudMediaContext(accountName, accountKey);
        var asset = await _context.Assets.CreateAsync("myjblobassets", AssetCreationOptions.None, CancellationToken.None);
        //... do something with asset and ms ...
    }
    return "http://my-link";
}

*注意:任何字节都可以,因为我们没有展示上传部分,我们确保创建媒体服务资产。

  1. 在索引视图中添加一个HTML form和提交button ,指向此帖子操作,运行它并运行!!!

在此输入图像描述

注意:在NAME中,输入新帐户的名称。 媒体服务帐户名称均为小写数字或字母,不含空格,长度为3 - 24个字符。 https://azure.microsoft.com/en-us/documentation/articles/media-services-dotnet-get-started/

我无法告诉你为什么它不能正常工作。 但我认为在构建函数时,问题比在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;
    }

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

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

     var asset = await CreateAssetBlobAsync(token);

     // ...
}

我认为问题将是你的using声明

事实上, MemoryStreamRead/Write Async方法实际上并没有提供任何真正的异步实现。 这意味着他们总是会同步的。

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

我建议避免使用带async的语句来防止死锁


你可以尝试调用方法吗?

Task<IAsset> CreateAsync(string assetName, string storageAccountName, AssetCreationOptions options, CancellationToken cancellationToken)

并传递与媒体服务关联的默认存储帐户名称。 在您的示例中,您正在调用查询默认存储帐户名称的方法。 存储帐户的查询不是异步进行的,而是一个错误。 此存储帐户查询每个上下文发生一次,不会在服务器上生成负载。 如果您可以在应用初始化期间进行查询并在以后的创建资产调用中使用它,那将是一件好事。

我希望“blobContainerName”是你在发帖时写的一个模拟? 大写字母和blob容器不混合:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM