0

dotnet core 3 出来了!所以,我需要在 WPF 应用程序中托管 aspnetcore。

尝试了这种方法,但是由于 VS 使用 csprojProject节点来确定输出,所以它不起作用。

有两个 nuget 包引起了我的注意:

Microsoft.AspNetCore.Mvc.Razor.Extensions

Microsoft.Extensions.Hosting

但不知道如何在 WPF 上实现这一点:(

有什么线索吗?

4

2 回答 2

3

这实际上很容易做到,我用我正在构建的 twitch 机器人完成了它,你需要在解决方案中同时拥有一个 wpf 和一个 asp.net 核心网站。将项目引用添加到您的 asp.net 核心网站并右键单击该项目并在设置下将其从控制台应用程序更改为类库。回到 App.xaml.cs 代码文件中的 wpf 应用程序中,您需要覆盖 OnStartup 并从那里启动您的网络服务器。一开始有点棘手,但在设置时效果很好。这样做有一个副作用,那就是 Web 应用程序中的 wwwroot 文件夹在构建时不会被复制,因此您需要手动复制它或在 Web 应用程序中使用构建后事件。这是我的后期构建事件作为示例:

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 应用程序将不会停止 Web 服务器。我还没有找到该部分的任何其他选择。

如果你想变得更漂亮,你也可以使用 SignalR 在 wpf 应用程序和 Web 服务器之间进行一些 IPC 通信。这就是当来自机器人的消息进入时我所做的,它们可以显示在页面上,在我的情况下用作流通知等的 obs 源。

希望这可以帮助你。和快乐的编码

于 2020-10-10T10:34:11.810 回答
1

使用 WPF,您可以使用设置为 ASP.NET 托管位置的 URL 的 WebBrowser 元素(在本例中我假设为 localhost)。确保使用 kestrel 独立而不是 IIS。我可能误解了您的问题,但您实际上是在使用 WPF 作为外壳来显示您的 ASP.NET Web 应用程序。与网络浏览器的功能不同。您实际上不会从 WPF 托管。

于 2020-06-08T00:10:25.843 回答