簡體   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