1、.NET Core 3.0安装配置
参考文档:.NET Core 3.0 (windows、linux、mac)安装配置
2、安装引用Grpc.AspNetCore
Grpc的NuGet地址:https://www.nuget.org/packages/Grpc.AspNetCore
使用命令安装
Install-Package Grpc.AspNetCore -Version 2.23.2
或
Nuget管理器中搜索"Grpc.AspNetCore"
,然后点击“安装”
相关文档:VS(Visual Studio)中Nuget的使用
3、配置gRPC
1) 在Startup.cs中配置
gRPC
是通过AddGrpc
方法启用的,每个 gRPC
服务通过MapGrpcService
方法添加到路由管道。代码如下:
public class Startup { //这个方法被运行时调用。使用此方法向容器添加服务。 //有关如何配置应用程序的更多信息,请访问 https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddGrpc(); } // 此方法由运行时调用。使用此方法配置HTTP请求管道。 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseEndpoints(endpoints => { // 与gRPC端点的通信必须通过gRPC客户端进行。 //要学习如何创建客户端,请访问: https://go.microsoft.com/fwlink/?linkid=2086909 endpoints.MapGrpcService<GreeterService>(); }); } }
ASP.NET Core 中间件和功能共享路由管道,因此可以将应用配置为提供其他请求处理程序。 其他请求处理程序(如 MVC 控制器)与已配置的 gRPC 服务并行工作。
2) 在 Program.cs中配置Kestrel
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(options => { // This endpoint will use HTTP/2 and HTTPS on port 5001. options.Listen(IPAddress.Any, 5001, listenOptions => { listenOptions.Protocols = HttpProtocols.Http2; listenOptions.UseHttps("<path to .pfx file>", "<certificate password>"); }); }); webBuilder.UseStartup<Startup>(); });
4、与 ASP.NET Core Api 集成
gRPC 服务对 ASP.NET Core 功能(如依赖关系注入(DI)和日志记录)具有完全访问权限。 例如,服务实现可以通过构造函数从 DI 容器解析记录器服务:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
5、解析 gRPC 方法中的 HttpContext
GRPC API 提供对某些 HTTP/2 消息数据(如方法、主机、标头和尾部)的访问权限。 通过传递给每ServerCallContext
个 gRPC 方法的参数访问:
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(
HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
ServerCallContext
在所有 ASP.NET api 中都HttpContext不提供对的完全访问权限。 扩展方法提供对在 ASP.NET api 中HttpContext表示基础 HTTP/2 消息的完全访问权限: GetHttpContext
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(
HelloRequest request, ServerCallContext context)
{
var httpContext = context.GetHttpContext();
var clientCertificate = httpContext.Connection.ClientCertificate;
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name + " from " + clientCertificate.Issuer
});
}
}
6、客户端调用代码
using System; using System.Net.Http; using System.Threading.Tasks; using GrpcGreeter; using Grpc.Net.Client; namespace GrpcGreeterClient { class Program { #region snippet static async Task Main(string[] args) { // The port number(5001) must match the port of the gRPC server. var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync( new HelloRequest { Name = "GreeterClient" }); Console.WriteLine("Greeting: " + reply.Message); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } #endregion } }
示例代码项目:https://github.com/aspnet/AspNetCore.Docs/tree/master/aspnetcore/tutorials/grpc/grpc-start/sample