能否在C#/.NET Core控制台应用中使用Grpc.AspNetCore搭建gRPC服务?
在.NET Core控制台应用中使用Grpc.AspNetCore搭建gRPC服务器
完全可以在.NET Core控制台应用中基于Grpc.AspNetCore实现gRPC服务器,核心思路是在控制台里手动初始化并启动ASP.NET Core主机,将gRPC服务托管在这个主机上。以下是具体实现步骤:
1. 创建项目并安装依赖
- 创建.NET Core控制台应用:
dotnet new console -n GrpcConsoleServer cd GrpcConsoleServer - 安装必需的NuGet包:
dotnet add package Grpc.AspNetCore dotnet add package Grpc.AspNetCore.Server.Reflection # 可选,用于gRPC服务反射(方便调试和工具调用)
2. 定义gRPC服务(以Greeter服务为例)
在项目中添加Protos/greet.proto文件,内容如下:
syntax = "proto3"; option csharp_namespace = "GrpcConsoleServer"; package greet; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply); } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; }
修改项目文件(.csproj),确保proto文件被正确处理:
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> </ItemGroup>
3. 实现gRPC服务类
创建Services/GreeterService.cs:
using Grpc.Core; using GrpcConsoleServer; namespace GrpcConsoleServer.Services; public class GreeterService : Greeter.GreeterBase { public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloReply { Message = $"Hello {request.Name} from console gRPC server!" }); } }
4. 编写控制台启动代码
修改Program.cs,初始化并启动ASP.NET Core主机:
using GrpcConsoleServer.Services; var builder = WebApplication.CreateBuilder(args); // 配置Kestrel监听端口(gRPC默认使用HTTP/2,需确保端口支持) builder.WebHost.ConfigureKestrel(options => { options.ListenAnyIP(5001, o => o.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2); }); // 添加gRPC服务 builder.Services.AddGrpc(); // 可选:添加反射服务,方便grpcurl等工具调试 builder.Services.AddGrpcReflection(); var app = builder.Build(); // 映射gRPC服务端点 app.MapGrpcService<GreeterService>(); // 可选:启用反射服务端点 app.MapGrpcReflectionService(); // 启动主机 await app.RunAsync();
5. 运行与测试
- 启动控制台服务器:
dotnet run - 用你已有的gRPC客户端连接
http://localhost:5001调用SayHello方法,即可收到服务器响应。
内容的提问来源于stack exchange,提问作者mustafa-naeem
相关产品推荐
相关产品推荐

