Bootstrap
本文主要介绍ASP.NET Core(.NET Core 3.0)中,使用gRPC服务的方法代码,包括服务端的配置和示例代码,及客户端使用及调用代码。

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