Встроенный Blazor ASP.NETC#

Место общения программистов C#
Ответить
Anonymous
 Встроенный Blazor ASP.NET

Сообщение Anonymous »

Преамбула
В нашей текущей настройке я разрабатываю библиотеку классов, которая действует как плагин для нашей платформы. Это «работает», поскольку исполняемый файл сканирует свой собственный каталог и автоматически загружает каждую сборку, соответствующую шаблону именования плагин_.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).
Я считаю, что это связано с тем, что мой wwwroot недоступен для библиотеки классов (несмотря на то, что я являюсь частью проекта).

Мне пришлось сделать следующее, например, в моем 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())}";
}
}
Насколько я понимаю, ресурсы, на которые ссылается MudBlazor, такие как _content/MudBlazor/MudBlazor.min.js, страдают от той же проблемы.
  • Может быть, мне не хватает каких-то конкретных настроек для Kestrel, чтобы сообщить ему, что _content должен указывать на встроенные пакеты/nuget?
  • Выполнимо ли то, чего я пытаюсь достичь?


Подробнее здесь: https://stackoverflow.com/questions/798 ... ded-blazor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»