son renta que pasivos pasivo masivos ingresos generen generan ejemplos dinero definicion crear como activos c# azure async-await azure-storage-blobs azure-media-services

c# - renta - ingresos pasivos masivos



System.NotSupportedException al intentar crear un activo (4)

¿Puedes intentar llamar al método?

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

y pase su nombre de cuenta de almacenamiento predeterminado asociado con el servicio de medios. En su ejemplo, está llamando al método que consulta el nombre de cuenta de almacenamiento predeterminado. La consulta de la cuenta de almacenamiento se ha realizado de forma no sincronizada y es un error. Esta consulta de cuenta de almacenamiento ocurre una vez por contexto para no generar carga en el servidor. Sería bueno si puede consultar durante la inicialización de la aplicación y usarla dentro de sus llamadas de activos de creación más adelante.

Estoy intentando utilizar la Azure MediaService API junto con la Azure Storage API en un API Service alojado en Azure .

El usuario envía la transmisión de video al servicio como un HttpPost , el servicio guarda el video como un blob en mi cuenta de almacenamiento, el servicio de medios codifica el video y cuando el enlace al video está listo, se lo devuelve al usuario.

Pero cuando intento crear un Asset se lanza un System.NotSupportedException con el mensaje:

Excepción arrojada: ''System.NotSupportedException'' en Microsoft.Data.Services.Client.dll Excepción lanzada: ''System.NotSupportedException'' en mscorlib.dll iisexpress.exe Error: 0: Excepción = System.NotSupportedException: Este marco de destino no le permite enumerar directamente sobre una consulta del servicio de datos. Esto se debe a que la enumeración envía automáticamente una solicitud sincrónica al servicio de datos. Como este marco solo admite operaciones asincrónicas, en su lugar debe llamar a los métodos BeginExecute y EndExecute para obtener un resultado de consulta que admita la enumeración.

Estoy usando las siguientes versiones de las dependencias requeridas:

Microsoft.Data.Services.Client - 5.6.2.0 Microsoft.WindowsAzure.MediaServices.Client - 3.0.0.8 Microsoft.WindowsAzure.Storage - 3.1.0.1

Aquí está mi código:

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 contiene el byte[] del video. La excepción se produce cuando se CreateAsync . Intenté _context.Assets.Create sin suerte.

EDITAR IMPORTANTE

Creé una nueva aplicación de consola, utilicé el código que estoy usando en el Servicio de API y se ejecutó con éxito. Entonces, el problema está en el servicio API.

Aquí están mis definiciones de clase y método

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

¿Alguna alternativa a eso tal vez?


Espero que "blobContainerName" sea un simulacro que escribiste al publicar la pregunta? Las mayúsculas y los contenedores de blob no se mezclan :)


No puedo decirte por qué no funciona exactamente. Pero creo que es más probable que el problema se encuentre en la construcción de su función que en la API de Azure.

Debería hacerse así:

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

Y esta función asíncrona debería llamarse así:

public static async Task ProcessNewBlobAsync() { // ... var asset = await CreateAssetBlobAsync(token); // ... }

Creo que el problema será tu Declaración de using .

El hecho es que los métodos Read/Write Async de MemoryStream realidad no proporcionan ningún tipo de implementación verdadera asincrónica. Lo que significa que siempre estarán sincronizados.

(Pero no llamaste a ninguno de ellos. Me temo que será un contenedor síncrono para el método async. Y así llamará a la API sincrónica en lugar de asincrónica. Esto es solo una idea).

Recomiendo evitar el uso de Sentencias con async para evitar un punto muerto .


Pude crear una demostración funcional usando .NET 4.6.1 y el siguiente paquete 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"; }

* Nota: cualquier byte está bien aquí ya que no estamos demostrando la parte de carga, nos estamos asegurando de que funcione la creación de un activo de servicio de medios.

  1. ¡Agregue un form HTML y envíe el button en la vista de índice que apunta a esta acción de publicación, ejecútelo y funciona!

Nota: En NAME, ingrese el nombre de la nueva cuenta. Un nombre de cuenta de Media Services son todos números en minúsculas o letras sin espacios, y tiene entre 3 y 24 caracteres de longitud. https://azure.microsoft.com/en-us/documentation/articles/media-services-dotnet-get-started/