开发手册 欢迎您!
软件开发者资料库

ASP.NET Core(.NET Core 3.0)使用gRPC服务(客户端和服务端)的方法代码

本文主要介绍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();        });    }}

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("",                         "");                });            });            webBuilder.UseStartup();        });

4、与 ASP.NET Core Api 集成

gRPC 服务对 ASP.NET Core 功能(如依赖关系注入(DI)和日志记录)具有完全访问权限。 例如,服务实现可以通过构造函数从 DI 容器解析记录器服务:

public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger logger)
{
}
}

5、解析 gRPC 方法中的 HttpContext

GRPC API 提供对某些 HTTP/2 消息数据(如方法、主机、标头和尾部)的访问权限。 通过传递给每ServerCallContext个 gRPC 方法的参数访问:

public class GreeterService : Greeter.GreeterBase
{
public override Task 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 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