Размещение страниц и 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.

Другие вопросы по тегам