Размещение страниц и API Razor (AspnetCore) внутри основного проекта WPF dotnet
Dotnet core 3 отсутствует! Итак, мне нужно разместить aspnetcore внутри приложения WPF.
Пробовал этот подход, но поскольку VS использует csprojProject
node для определения вывода, он не работает.
Мое внимание привлекли два пакета nuget:
Microsoft.AspNetCore.Mvc.Razor.Extensions
А ТАКЖЕ
Microsoft.Extensions.Hosting
Но понятия не имею, как это реализовать в WPF:(
Какие-нибудь подсказки?
1 ответ
На самом деле это довольно просто сделать, я сделал это с помощью созданного мной Twitch-бота, вам нужно, чтобы в решении были как wpf, так и основной веб-сайт asp.net. добавьте ссылку на проект на свой основной веб-сайт asp.net и щелкните проект правой кнопкой мыши, а в настройках измените его с консольного приложения на библиотеку классов. вернувшись в приложение wpf в файл кода App.xaml.cs, вам нужно переопределить OnStartup и оттуда запустить свой веб-сервер. Сначала это немного сложно, но при настройке работает хорошо. у этого есть один побочный эффект, а именно: папка wwwroot из веб-приложения не копируется во время сборки, поэтому вам нужно либо вручную скопировать ее, либо использовать событие пост-сборки в веб-приложении. это мое событие сборки поста в качестве примера:
xcopy /E /Y "$(ProjectDir)wwwroot" "F:\Repos\StreamTools\ControlCenter\bin\Debug\netcoreapp3.1\wwwroot"
это мой App.xaml.cs:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using StreamTools.Core;
using System.Diagnostics;
using System.Windows;
namespace StreamTools.ControlCenter
{
public partial class App : Application
{
private IHost webHost;
protected override void OnStartup(StartupEventArgs e)
{
webHost = Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(builder => builder.UseStartup<Web.Startup>())
.ConfigureAppConfiguration(configBuilder =>
{
configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
configBuilder.AddEnvironmentVariables();
if (Debugger.IsAttached)
{
configBuilder.AddUserSecrets<App>();
}
})
.Build();
webHost.StartAsync();
webHost.Services.GetService<IHostApplicationLifetime>().ApplicationStopping.Register(OnAppStopping);
}
private void OnAppStopping()
{
webHost.Dispose();
}
protected override void OnExit(ExitEventArgs e)
{
webHost.StopAsync();
base.OnExit(e);
}
}
}
Из-за того, как работает пустельга, я не уверен, что это ошибка или как она только что построена, вам нужно подключить IHostApplicationLifetime и принудительно вызвать метод dispose. без этой ловушки событий закрытие приложения wpf не остановит веб-сервер. Я не нашел другого варианта для этой части.
Если вы хотите по-настоящему наворочить, вы также можете использовать SignalR для небольшого взаимодействия IPC между приложением wpf и веб-сервером. это то, что я делаю, когда приходят сообщения от бота, они могут отображаться на странице, которая используется в моем случае как источник obs для потоковых уведомлений и т. д.
Надеюсь, что это помогает вам. и счастливого кодирования
В WPF вы можете использовать элемент WebBrowser, настроенный на URL-адрес вашего размещенного в ASP.NET расположения (в данном случае я предполагаю localhost). Убедитесь, что вы используете автономную версию Kestrel, а не IIS. Возможно, я неправильно понимаю ваш вопрос, но вы, по сути, будете использовать WPF в качестве оболочки для отображения своего веб-приложения ASP.NET. Мало чем отличается от того, что делает веб-браузер. На самом деле вы не будете размещать в WPF.