5

我正在使用 .NET Core 3.1 并希望创建一个 GRPC 服务,其中控制台应用程序作为服务器,WPF 应用程序作为客户端。

我在网上看不到任何示例 - 由于某种原因,所有控制台应用程序似乎都连接并发送消息,没有一个是服务器。

是否可以让控制台应用程序启动服务和 WPF 应用程序连接并向其发送消息?

我已经下载了下面的项目,并试图看看我是否可以让控制台应用程序成为服务器。[.NET Core 中的 GRPC][1]

任何指针表示赞赏。[1]:https ://www.jenx.si/2019/06/14/experimenting-with-grpc-in-net-core/

下面的控制台应用程序现在是服务器,但我无法在 Main 函数中读取和存储来自客户端的有效负载 - 我可以看到它是从客户端接收的。

如何将来自客户端的有效负载消息存储在 Main 函数中?

//Console App Main function listening for

static async Task Main(string[] args)
{
        _gRpcServer = new Server
        {
            Services ={Jenx.Grpc.SimpleDemo.Contracts.JenxSimpleGrpcService.BindService(new ConsoleAppGrpcClient())},
            Ports = {new ServerPort("localhost", 505050, ServerCredentials.Insecure)}
        };
}

//receives Client Message successfully
public override Task<ReplyMessage> SendMessage(RequestMessage request, ServerCallContext context)
    {
        Console.WriteLine($"Message Received: {request.RequestPayload}");
        Console.WriteLine("Sending message back to the client...");

//<<---need to Store below in variable and return to Main function above--->>
        return Task.FromResult(new ReplyMessage { ResponsePayload = $"ServerSideTime is {DateTime.Now}" });
    }
4

5 回答 5

2

您应该查看gRPC GitHub 存储库中的Helloworld 示例。它包含一个简单的 gRPC 服务,其中服务器部分和客户端部分都是 C# 控制台应用程序。使用 .NET SDK Core 2.1,但应该在 .NET Core 3.1+ 和 .NET 5+ 中工作(我没有在这些版本上尝试过)。

于 2021-09-16T19:00:36.140 回答
2

我从一开始就使用控制台 grpc 服务器进行测试,首先在 .net 2.1 中,现在在 5.0 中。

    class Program
{
    const string ServerEndpoint = "localhost";
    const int Port = 50051;
    const string ExitCommand = "exit";

    static void Main(string[] args)
    {
        var serverStub = new MyGrpcServerStub();

        var server = new Server
        {
            Services =
            {
                grpcNameSpace.GrpcServer.BindService(serverStub),
            },
            Ports = {new ServerPort(ServerEndpoint, Port, ServerCredentials.Insecure)}
        };
        server.Start();

        var keyStroke = string.Empty;
        while (keyStroke != ExitCommand)
        {
            var random = new Random();
            keyStroke = Console.ReadLine();

            if (!string.IsNullOrWhiteSpace(keyStroke) && keyStroke != ExitCommand)
            {
                // Do some stuff to trigger things on the server side

            }
        }

        serverStub.CloseStreams();
        server.ShutdownAsync().Wait();
    }
}

只需从 Protobuf 编译器创建的 Grpc 服务器库继承,并覆盖来自 proto 的所有 RPC 调用,如下所示:

    public class MyGrpcServerStub : grpcNameSpace.GrpcServer.MyXXXXBase
{

    public override Task<BoolValue> GetStuff(ProtoVersion request, ServerCallContext context)
    {
        return Task.FromResult(new BoolValue() { Value = true});
    }
}

出于测试目的,我将值存储在 MyGrpcServerStub 中,但您可以将其存储在任何您喜欢的位置。

于 2020-11-30T15:22:41.433 回答
1

在 .NET Core 3.1 中,“gRPC 服务”项目只是一个控制台应用程序,在项目模板中添加了额外的东西。运行时会出现一个控制台窗口,您可以将文本写入控制台(通常通过记录器)。如果由于某种原因您不能使用新的 gRPC 服务项目,您仍然可以创建一个临时项目并将多余的文件(Program.cs、Startup.cs 等)和依赖项剪切并粘贴到您的控制台应用程序中。

于 2020-10-01T03:24:03.317 回答
0

我希望你一切都好。关于您的问题,您可以创建一个控制台程序并使用它们来托管 WCF 服务以发布对客户端 WPF 或 WinForm 客户端的访问。在此架构中,您有 3 层。当您配置端点时,数据库层、中间业务层和客户端层以及连接可以通过 TCP 或 HTTPS。也可以将 WCF 托管在 Windows 服务或守护程序中。在 .NET Core 中,我认为您可以创建 WCF 服务或类似服务,并将它们托管在控制台程序或服务中。

于 2020-09-29T16:27:36.040 回答
0

要存储从客户端接收到的消息,您可以添加接收到的通知处理程序,并且在处理程序中,您可以添加用于存储接收到的消息的进程。利用 MediatR 框架

于 2021-09-05T14:52:19.517 回答