В нашей текущей настройке я разрабатываю библиотеку классов, которая действует как плагин для нашей платформы. Это «работает», поскольку исполняемый файл сканирует свой собственный каталог и автоматически загружает каждую сборку, соответствующую шаблону именования плагин_.dll. Когда такая сборка загружается, исполняемый файл ищет любой класс, реализующий определенный интерфейс, и вызывает для него метод StartService().
Что я пытаюсь сделать?
Одно из наших требований — иметь форму конфигурации для конечного пользователя. Мы хотим добиться этого, запустив внутренний поток Kestrel и обслуживая базовое приложение Blazor, которое позволяет пользователю войти в систему с именем пользователя и паролем, а затем установить некоторые значения, которые сохраняются и передаются на платформе посредством обработки событий.
Что работает?
Реализация действительно работает в том смысле, что я могу развернуть свой сервер Kestrel и обслуживать написанный мною контент Blazor. Для этого я создал класс WebServer на C#, который использует классы WebApplication и WebApplicationBuilder для создания и настройки всего сервера Kestrel, включения Blazor и использования контейнера DI для внедрения всех служб и зависимостей.
Код: Выделить всё
internal class WebServer : IDisposable
{
private Task? _applicationThread;
private readonly ILogger _logger = logger;
private readonly CancellationTokenSource _cancellationTokenSource = new();
public void Start()
{
var token = _cancellationTokenSource.Token;
_logger.LogInformation("Starting web server");
var application = BuildWebApplication();
application.UseStaticFiles();
application.UseRouting();
application.UseAuthorization();
application.MapRazorComponents().AddInteractiveServerRenderMode();
application.UseAntiforgery();
_applicationThread = Task.Run(async () => await application.StartAsync(token), token);
}
}
В чем проблема?
Когда я получаю доступ к приложению на локальном хосте, я действительно могу заставить встроенный сервер обработать запрос. Но все компоненты, обрабатываемые через MudBlazor, не работают, поскольку встроенные ресурсы из этого пакета nuget недоступны:
Код: Выделить всё
[2025-11-06T14:42:06.438Z] Error: Microsoft.JSInterop.JSException: Could not find 'mudElementRef.getBoundingClientRect' ('mudElementRef' was undefined).
Мне пришлось сделать следующее, например, в моем App.razor, чтобы значок работал:
Код: Выделить всё
@using System.Reflection
@using Microsoft.AspNetCore.Components.Authorization
[*]
@code {
private string FaviconUrl { get; set; } = string.Empty;
protected override void OnInitialized()
{
base.OnInitialized();
// This is workaround to load the favicon from embedded resources
using var imageStream = Assembly
.GetExecutingAssembly()
.GetManifestResourceStream("MyQ.PlugIn.GatewayConfigurationPlugin.wwwroot.favicon.png");
using var ms = new MemoryStream();
imageStream?.CopyTo(ms);
FaviconUrl = $"data:image/png;base64,{Convert.ToBase64String(ms.ToArray())}";
}
}
- Может быть, мне не хватает каких-то конкретных настроек для Kestrel, чтобы сообщить ему, что _content должен указывать на встроенные пакеты/nuget?
- Выполнимо ли то, чего я пытаюсь достичь?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ded-blazor
Мобильная версия