To use static (html) files in a NUGET ASP.NET Core package to be displayed I have used the following solution
1. Put the files in a folder ( in my case,blocklyAutomation )
2. Put in the .csproj to embed the files
<ItemGroup>
<EmbeddedResource Include=”BlocklyAutomation\**\*”>
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
3. Create an extension to use it
;
public static void UseBlocklyUI(this IApplicationBuilder appBuilder)
{
    var manifestEmbeddedProvider =
            new ManifestEmbeddedFileProvider(Assembly.GetExecutingAssembly());
    var service = appBuilder.ApplicationServices;
    mapFile("blocklyAutomation",manifestEmbeddedProvider,appBuilder);
}
private static void mapFile(string dirName,IFileProvider provider,IApplicationBuilder appBuilder)
{
    var folder = provider.GetDirectoryContents(dirName);
    foreach (var item in folder)
    {
        if (item.IsDirectory)
        {
            mapFile(dirName + "/" + item.Name,provider,appBuilder);
            continue;
        }
        string map = (dirName + "/" + item.Name).Substring(dirName.Length);
        appBuilder.Map(map,app =>
        {
            var f = item;
            app.Run(async cnt =>
            {
                //TODO: find from extension
                //cnt.Response.ContentType = "text/html";
                using var stream = new MemoryStream();
                using var cs = f.CreateReadStream();
                byte[] buffer = new byte[2048]; // read in chunks of 2KB
                int bytesRead;
                while ((bytesRead = cs.Read(buffer,0,buffer.Length)) > 0)
                {
                    stream.Write(buffer,0,bytesRead);
                }
                byte[] result = stream.ToArray();
                var m = new Memory<byte>(result);
                await cnt.Response.BodyWriter.WriteAsync(m);
            });
        });
    }
}
4. That is all
Leave a Reply