是否可以将GRPC控制台应用程序创建为服务器?

时间:2020-09-29 16:01:48

标签: c# wpf console-application grpc asp.net-core-3.1

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

我看不到任何在线示例-由于某些原因,所有控制台应用程序似乎都可以连接并发送消息,而服务器都不是。

是否可以有一个启动应用程序的控制台应用程序和一个连接并向其发送消息的WPF应用程序?

我已经下载了以下项目,并试图查看是否可以将Console App用作服务器。 [.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}" });
    }

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在.NET Core 3.1中,“ gRPC Service”项目只是一个控制台应用程序,在项目模板中添加了其他内容。运行控制台窗口时,会显示该窗口,您可以将文本写入控制台(通常通过Logger)。如果由于某种原因您不能使用新的gRPC Service项目,则仍可以创建一个临时项目,并将多余的文件(Program.cs,Startup.cs等)和依赖项剪切并粘贴到控制台应用程序中。

答案 2 :(得分:0)

我从一开始就使用控制台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内,但是您可以将其存储在任意位置。