将 gRPC 服务添加到 ASP.NET Core 应用

gRPC包。

配置 gRPC

在 Startup.cs 中:

  • gRPC 是通过AddGrpc方法启用的。
  • 每个 gRPC 服务通过MapGrpcService方法添加到路由管道。
复制
 
 
public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            // Communication with gRPC endpoints must be made through a gRPC client.
            // To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909
            endpoints.MapGrpcService<GreeterService>();
        });
    }
}

其他请求处理程序 (如 MVC 控制器) 与已配置的 gRPC 服务并行工作。

配置 Kestrel

Kestrel gRPC 终结点:

  • 需要 HTTP/2。
  • 传输层安全性(TLS)来保护。

HTTP/2

HttpRequest为HTTP/2

默认情况下,Kestrel 终结点配置为支持 HTTP/1.1 和 HTTP/2 连接。

TLS

https前缀验证 Kestrel 终结点是否正在使用 TLS。

在下面的appsettings示例中,提供了使用 TLS 保护的 HTTP/2 终结点:

复制
 
{
  "Kestrel": {
    "Endpoints": {
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Protocols": "Http2",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    }
  }
}

或者,可以在Program.cs中配置 Kestrel 终结点:

复制
 
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(options =>
            {
                options.Listen(IPAddress.Any, 5001, listenOptions =>
                {
                    listenOptions.Protocols = HttpProtocols.Http2;
                    listenOptions.UseHttps("<path to .pfx file>", 
                        "<certificate password>");
                });
            });
            webBuilder.UseStartup<Startup>();
        });

协议协商

此协商确定连接是使用 HTTP/1.1 还是 HTTP/2。

到不安全终结点的所有连接默认为 HTTP/1.1,并且 gRPC 调用失败。

Kestrel 终结点配置。

 备注

无法在 macOS 上启用 ASP.NET Core gRPC 应用。

与 ASP.NET Core Api 集成

例如, 服务实现可以通过构造函数从 DI 容器解析记录器服务:

复制
public class GreeterService : Greeter.GreeterBase
{
    public GreeterService(ILogger<GreeterService> logger)
    {
    }
}

默认情况下, gRPC 服务实现可以解析具有任意生存期 (单独、作用域或暂时性) 的其他 DI 服务。

解析 gRPC 方法中的 HttpContext

通过传递给每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
        });
    }
}

扩展方法提供对在 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
        });
    }
}

Azure 应用服务不支持 gRPC

相关文章:

  • 2020-07-13
  • 2021-05-19
  • 2021-09-27
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2019-04-01
  • 2022-12-23
猜你喜欢
  • 2019-11-27
  • 2019-09-25
  • 2021-08-20
  • 2021-08-25
  • 2022-01-01
相关资源
相似解决方案