Fix AdminStaticFilesMiddleware to use simple file serving instead of internal ASP.NET classes

This commit is contained in:
2026-02-03 14:43:24 -05:00
parent ffed9a67f3
commit 71c4241a8a

View File

@@ -1,3 +1,6 @@
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
namespace allstarr.Middleware;
/// <summary>
@@ -7,30 +10,15 @@ namespace allstarr.Middleware;
public class AdminStaticFilesMiddleware
{
private readonly RequestDelegate _next;
private readonly StaticFileMiddleware _staticFileMiddleware;
private readonly DefaultFilesMiddleware _defaultFilesMiddleware;
private readonly IWebHostEnvironment _env;
private const int AdminPort = 5275;
public AdminStaticFilesMiddleware(
RequestDelegate next,
IWebHostEnvironment env,
ILoggerFactory loggerFactory)
IWebHostEnvironment env)
{
_next = next;
var staticFileOptions = new StaticFileOptions();
var defaultFilesOptions = new DefaultFilesOptions();
_staticFileMiddleware = new StaticFileMiddleware(
_next,
env,
Microsoft.Extensions.Options.Options.Create(staticFileOptions),
loggerFactory);
_defaultFilesMiddleware = new DefaultFilesMiddleware(
(ctx) => _staticFileMiddleware.Invoke(ctx),
env,
Microsoft.Extensions.Options.Options.Create(defaultFilesOptions));
_env = env;
}
public async Task InvokeAsync(HttpContext context)
@@ -39,13 +27,50 @@ public class AdminStaticFilesMiddleware
if (port == AdminPort)
{
// Serve static files on admin port
await _defaultFilesMiddleware.Invoke(context);
var path = context.Request.Path.Value ?? "/";
// Serve index.html for root path
if (path == "/" || path == "/index.html")
{
var indexPath = Path.Combine(_env.WebRootPath, "index.html");
if (File.Exists(indexPath))
{
context.Response.ContentType = "text/html";
await context.Response.SendFileAsync(indexPath);
return;
}
}
// Try to serve static file from wwwroot
var filePath = Path.Combine(_env.WebRootPath, path.TrimStart('/'));
if (File.Exists(filePath))
{
var contentType = GetContentType(filePath);
context.Response.ContentType = contentType;
await context.Response.SendFileAsync(filePath);
return;
}
}
else
// Not admin port or file not found - continue pipeline
await _next(context);
}
private static string GetContentType(string filePath)
{
var ext = Path.GetExtension(filePath).ToLowerInvariant();
return ext switch
{
// Skip static files on main port
await _next(context);
}
".html" => "text/html",
".css" => "text/css",
".js" => "application/javascript",
".json" => "application/json",
".png" => "image/png",
".jpg" or ".jpeg" => "image/jpeg",
".gif" => "image/gif",
".svg" => "image/svg+xml",
".ico" => "image/x-icon",
_ => "application/octet-stream"
};
}
}