.NET Core gRPC实战篇

本文介绍了如何使用.NET Core 3.1进行gRPC服务端和客户端的实战。首先,创建了一个gRPC服务端,包括定义.proto文件、实现服务以及模拟数据。接着,创建了一个gRPC客户端,展示了如何调用服务端的方法并实现了登录功能。最后,通过注入gRPC服务,简化了客户端的调用方式。文章提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇.NET Core gRPC理论篇中详细介绍了gRPC,本文将正式进行项目实践。

本文使用的是.NET Core 3.1。

为了更加清楚的了解gRPC和WebAPI的区别,这里使用一个登录,获取Token的例子进行讲解。

1.创建gRPC服务端

创建新项目,搜索gRPC 

创建一个项目,命名为【Token】

 删除原有的*.proto文件,创建一个新的*.proto,并命名为grpcService.proto

编写如下代码信息

syntax = "proto3";

option csharp_namespace = "grpcService";

package token;

//创建认证服务,登录,并获取token
service Login {
  // Sends a greeting
  rpc GetToken (UserInfo) returns (Token);
}
message UserInfo {
  string userName = 1;
  string userpwd = 2;
}

message Token{
  string message=1;
  string Expiration=2;
  string AutkToken=3;
}

 然后直接重新生成解决方案,会自动生成需要的文件。

右键项目,打开 *.csproj

 创建服务,新建一个AuthenRRpcService的是实现服务,编写代码如下:

  public class AuthenRRpcService : Login.LoginBase
    {
        public override Task<grpcService.Token> GetToken(UserInfo request, ServerCallContext context)
        {
            grpcService.Token token = new grpcService.Token();
            //模拟数据库,验证用户信息
            var result = MorkUserInfos.UserInfo.FirstOrDefault(x => x.Name == request.UserName && x.Pwd == request.Userpwd);
            if (result == null)
            {
                token.Message = "用户名或密码错误";
            }
            else
            {
                DateTime dd = new DateTime(1970, 1, 1, 0, 0, 0, 0);
                TimeSpan ts = (DateTime.Now.AddHours(2) - dd);

                token.Message = "登录成功";
                //模拟随便生成一个token
                token.AutkToken = Guid.NewGuid().ToString();
                token.Expiration = ts.TotalMilliseconds.ToString();
            }
            return Task.FromResult<grpcService.Token>(token);
        }
    }

在Startup创建一组模拟数据,简单模拟数据库

  //模拟数据
            MorkUserInfos.UserInfo.Add(new UserDB() { Id = 1, Name = "www", Pwd = "www" });
            MorkUserInfos.UserInfo.Add(new UserDB() { Id = 2, Name = "eee", Pwd = "eee" });
            MorkUserInfos.UserInfo.Add(new UserDB() { Id = 3, Name = "rrr", Pwd = "rrr" });
            MorkUserInfos.UserInfo.Add(new UserDB() { Id = 4, Name = "ttt", Pwd = "ttt" });
            MorkUserInfos.UserInfo.Add(new UserDB() { Id = 5, Name = "yyy", Pwd = "yyy" });
            MorkUserInfos.UserInfo.Add(new UserDB() { Id = 6, Name = "uuu", Pwd = "uuu" });
            MorkUserInfos.UserInfo.Add(new UserDB() { Id = 7, Name = "qqq", Pwd = "qqq" });

 

 

2.创建gRPC客户端

客户端创建一个webapi项目,命名为WebProject,将服务端的grpcService.proto复制到当前项目中。打开*.csproj,将GrpcServices修改为Client

nuget包下载Grpc.AspNetCore

然后直接重新生成解决方案,会自动生成需要的文件。

 

创建一个控制器,编写一个登录的API,调用gRPC服务

 /// <summary>
        /// 登录
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> UserResult(UserReq userReq)
        {
            try
            {
                UserInfo request = new UserInfo();
                request.UserName = userReq.UserName;
                request.Userpwd = userReq.UserPwd;
                using var channel = GrpcChannel.ForAddress("https://localhost:5001");
                var client = new Login.LoginClient(channel);
                Token token = await client.GetTokenAsync(request);     
                return Ok(new
                {
                    code = "200",
                    msg = "成功",
                    data = token
                });
            }
            catch (System.Exception ex)
            {

                return Ok(new
                {
                    code = "200",
                    msg = "失败" + ex.Message
                });
            }
        }

使用Postman请求,发现已经可以看到数据

 以上调用方法类似于直接调用,下面通过注入grpc服务,进行调用,在Startup中,注入grpc服务

 services.AddGrpcClient<Login.LoginClient>(o =>
            {
                o.Address = new Uri("https://localhost:5001");
            });

在控制器中,注入我们编写的gRPC服务

 调用的时候,可以直接调用

*注,生成的gRPC服务,支持同步和异步两种方式,比如我这边创建的是GetToken方法,同步的时候,可以 直接调用GetToken方法,异步可以调用GetTokenAsync,对应的使用postman,可以看到请求信息如下:

至此,.NET Core gRPC实战篇结束。

本文所有代码下载地址如下:

服务端代码:点击下载

客户端代码:点击下载

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值