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