Skip to content
微信扫码关注公众号

ASP.NET Core gRPC

首先要下载 Visual Studio 预览版.NET Core 3.0v SDK

如果不想安装 VS 预览版,可以参考 .NET Core tooling update for Visual Studio 2017 version 15.9 启用预览版的 .NET Core SDK。(选项位置:Tools > Options > Projects and Solutions > .NET Core: > Use Previews of the .NET Core SDK

具体的教程参考下面的官方文档:

  1. 教程:开始使用 ASP.NET Core 中的 gRPC 服务

    简单来说就是创建一个 ASP.NET Core Web Application => gRPC 服务 模板项目。
    直接使用该默认项目即可。其代码如下:

    依赖项:

    • Google.Protobuf -Version 3.7.0
    • Grpc.AspNetCore.Server -Version 0.1.20-pre1
    • Grpc.Tools -Version 1.20.0-pre3

    Program.cs

    csharp
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Hosting;
    
    namespace FirstGrpc
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    });
        }
    }

    Startup.cs

    csharp
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    
    namespace FirstGrpc
    {
        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>();
                });
            }
        }
    }

    Protos/greet.proto

    proto
    syntax = "proto3";
    
    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;
    }

    Services/GreeterService.cs

    csharp
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Greet;
    using Grpc.Core;
    
    namespace FirstGrpc
    {
        public class GreeterService : Greeter.GreeterBase
        {
            public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
            {
                return Task.FromResult(new HelloReply
                {
                    Message = "Hello " + request.Name
                });
            }
        }
    }

    appsettings.json

    json
    {
        "Logging": {
            "LogLevel": {
            "Default": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
            }
        },
        "AllowedHosts": "*",
        "Kestrel": {
            "EndpointDefaults": {
            "Protocols": "Http2"
            }
        }
    }
  2. 教程:创建 .NET Core gRPC 客户端

    暂时还么有 gRPC 客户端的模板,需要创建 控制台项目,然后手动添加 NuGet 包。

    powershell
    Install-Package Grpc.Core
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools

    复制 Protos\greet.proto 到客户端项目后,需手动修改工程文件。

    右键点击工程,选择 编辑项目文件 选项。

    Project 下新增一个 ItemGroup

    xml
    <ItemGroup>
        <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
    </ItemGroup>

    保存后重新加载项目。

    修改 Program.cs 中的 main 方法。

    csharp
    using Greet;
    using Grpc.Core;
    using System;
    using System.Threading.Tasks;
    
    namespace FirstGrpcClient
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                // The port number here must match the port of the gRPC server
                var channel = new Channel("localhost:50051", ChannelCredentials.Insecure);
                var client = new Greeter.GreeterClient(channel);
    
                var reply = await client.SayHelloAsync(new HelloRequest { Name = "GreeterClient" });
                Console.WriteLine("Greeting: " + reply.Message);
    
                await channel.ShutdownAsync();
    
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }
    }

    分别启动两个项目后,客户端程序打印结果如下:

    bash
    Greeting: Hello GreeterClient
    Press any key to exit...
  3. 官方的 示例代码

  4. 项目结构