Servir archivos incrustados en la biblioteca .net a HTML en Blazor

.net-standard blazor c# embedded-resource javascript

Pregunta

Estoy creando un Blazor v0.5.1 proyecto que está utilizando una biblioteca .NET estándar a proporcionado toda la lógica de negocio. Esta biblioteca tiene varios archivos WAV almacenados como recursos incrustados.

El consumo de uno de los recursos en una tecnología .NET típica (WinForms, WPF, etc.) que hace referencia a esta biblioteca se puede hacer con esto:

var assemName = "MyLibName";
var assembly = AppDomain
    .CurrentDomain
    .GetAssemblies()
    .First(a => a.GetName().Name == assemName);

//memory stream
var stream = assembly.GetManifestResourceStream($"{assemName}.mysound.wav");

//Can play the file at some point later
var player = new SoundPlayer(stream)
player.Play();

Me gustaría hacer el equivalente en Blazor. En este momento, tengo sonidos trabajando en la aplicación al copiar / pegar los archivos wav en la carpeta wwwroot\sounds del proyecto para que se sirva como contenido HTML estático. Luego, en JavaScript, puedo jugar uno así:

var assemName = "MyLibName";
var assembly = AppDomain
    .CurrentDomain
    .GetAssemblies()
    .First(a => a.GetName().Name == assemName);

//memory stream
var stream = assembly.GetManifestResourceStream($"{assemName}.mysound.wav");

//Can play the file at some point later
var player = new SoundPlayer(stream)
player.Play();

Pero lo que realmente me gustaría hacer es evitar copiar y pegar y de alguna manera servir los archivos dinámicamente como puntos finales para que sea transparente para JS.

Respuesta popular

Bueno, pude conseguirlo. No estoy seguro si es de la mejor manera pero parece funcionar bien.

Tuve que añadir la extensión de almacenamiento blazor:

https://github.com/BlazorExtensions/Storage

que actúa como un proxy para el SessionStorage de JavaScript y LocalStorage de .NET. Una vez cargado, agregué cada archivo wav incrustado desde .NET de esta manera:

foreach (var kvp in SoundStreamDictionary)
{
    await sessionStorage.SetItem(
        kvp.Key.ToString().ToLower()  //Key is the name of the sound
        , kvp.Value.ToBase64()  //Value is a Stream object
    );
}

El ToBase64 es bastante estándar para la manipulación de secuencias .NET:

foreach (var kvp in SoundStreamDictionary)
{
    await sessionStorage.SetItem(
        kvp.Key.ToString().ToLower()  //Key is the name of the sound
        , kvp.Value.ToBase64()  //Value is a Stream object
    );
}

Ahora todos los datos se almacenan en JavaScript SessionStorage como cadenas. El truco ahora es decodificar eso para audio. Con la ayuda de este método de ayuda JS (gracias a esta publicación de StackOverflow ):

foreach (var kvp in SoundStreamDictionary)
{
    await sessionStorage.SetItem(
        kvp.Key.ToString().ToLower()  //Key is the name of the sound
        , kvp.Value.ToBase64()  //Value is a Stream object
    );
}

Ponga eso y esto en el archivo JsInterop.js de BlazorComponent:

foreach (var kvp in SoundStreamDictionary)
{
    await sessionStorage.SetItem(
        kvp.Key.ToString().ToLower()  //Key is the name of the sound
        , kvp.Value.ToBase64()  //Value is a Stream object
    );
}

Y FINALMENTE los sonidos pueden ser invocados por nombre desde .Net:

foreach (var kvp in SoundStreamDictionary)
{
    await sessionStorage.SetItem(
        kvp.Key.ToString().ToLower()  //Key is the name of the sound
        , kvp.Value.ToBase64()  //Value is a Stream object
    );
}



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué