WPF 桌面应用程序中的 gRPC 服务器?

And*_*ens 4 .net grpc asp.net-core

我目前正在使用 gRPC,到目前为止已经创建了一个简单的 C# hello world 演示,使用 Visual StudioASP.Net Core gRPC Service项目作为服务器和客户端控制台应用程序。

接下来我想做的是让 gRPC 服务器在 .Net 6 WPF 桌面应用程序(称为“AppA”)中运行,从而允许另一个桌面应用程序(“AppB”)向 AppA 发出信息请求。这可能吗?

通常我会使用 WCF 来实现此目的,但由于 CoreWCF 的不成熟,我被警告不要使用它。

And*_*ens 5

我找到了一种在 WPF 桌面应用程序中托管 gRPC 服务的方法。

该项目需要引用“Grpc.AspNetCore”包(没有“proto”东西,稍后你会明白为什么)。

然后是启动 Web 应用程序的代码。出于演示应用程序的目的,我在 MainWindow.xaml.cs 中实现了此功能:

private WebApplication? _app;

public MainWindow()
{
    InitializeComponent();
    Task.Run(() => StartServer());
}

private void StartServer()
{
    var builder = WebApplication.CreateBuilder();

    // Despite adding a "launchSettings.json" file to the project, I couldn't find a way 
    // for the builder to pick it up, so had to configure the URLs here:
    builder.WebHost.UseUrls("http://*:5219", "https://*:7219");

    builder.Services.AddGrpc();

    _app = builder.Build();
    _app.MapGrpcService<TestService>();
    _app.Run();
}

private void MainWindow_OnClosing(object? sender, CancelEventArgs e)
{
    _app?.StopAsync();
}
Run Code Online (Sandbox Code Playgroud)

对 _app.Run() 的调用会阻塞(直到 Web 应用程序停止),这就是为什么我在 ab/g 线程上调用 StartServer() 的原因。

我发现一篇文章指出 proto 编译器在 WPF 项目中无法正常工作。尽管它正在生成类,但构建错误表明无法找到这些类。解决方案是将“protos”内容和服务类添加到类库中,然后从 WPF“服务器”引用它。类库项目需要引用以下包:

  • 谷歌Protobuf
  • Grpc.AspNetCore
  • Grpc.工具