注意:使用计算机名称,目录不要出现任何中文 ,包括注释等,一点中文都有可能造成翻车http://tnblog.net/17726394069/article/details/6134)
第一步:
使用NuGet下载三个包(与上一篇.net Core使用一样)
Microsoft.EntityFrameworkCore.SqlServer:Sql Server数据库EF提供程序
Microsoft.EntityFrameworkCore.Design:设计时EF共享库
Microsoft.EntityFrameworkCore.Tools:EF的NuGet包管理器命令工具
*到这步以后,有的会出现包上出现黄色感叹号的报错,这就是因为你在哪里用了中文,我们是出现最多的问题就是用户名用了中文,这是个大忌,计算机用户名必须为英文哦,如果出现计算机用户名是中文的情况,去解决或者换名字的时候,一定要注意,或者备份之类的,别把计算机弄崩了。
第二步:
在NuGet管理器控制输入指令生成实体类和上下文类
语句:
Scaffold-DbContext ‘连接字符串’ 数据提供程序名称 -OutputDir 结果输出文件夹 -Context 数据上下文名
–DataAnnotations
例如:
Scaffold-DbContext ‘Data Source=.\SQL2017;Initial Catalog=ShoppingDB;
Integrated Security=True;’ Microsoft.EntityFrameworkCore.SqlServer
-OutputDir Models -Context ShopContext
第三步:
右键项目 — 新建项 — ASP.NET CORE 常规下选择 协议区缓冲文件 — 取名xxx.proto(这里举例取名为:shop.proto)
第四步:
定义protobuf接口文件
syntax = "proto3";
option csharp_namespace = "GrpcService";
package product;
import "google/protobuf/empty.proto";
service ProductManager{
rpc GetProductByID(ProductRequest) returns (ProductResponse);
rpc GetProductList(google.protobuf.Empty) returns (ProductListResponse);
}
message ProductInfo{
int32 ProductId=1;
string ProductName=2 ;
int32 CategoryId=3;
double ProductPrice=4;
int32 Stock=5;
string ProductDesc =6;
string ProductImg =7;
}
message ProductRequest{
int32 id=1;
}
message ProductResponse{
ProductInfo product=1;
}
message ProductListResponse{
repeated ProductInfo product=1;
}
完成以后,先看看错误列表有没有报错,有报错先解决报错。一般来说只要步骤和操作按照我的来了,不会有报错
第五步:
右键添加服务引用 注意是【服务端】,然后运行检查protobuf文件是否书写正确
*添加完成后项目重新生成一次
第六步:
在appsettings.json文件中添加连接字符串json
{
"ConnectionStrings": {
"ShopConStr": "Data Source=.;Initial Catalog=ShoppingDB; Integrated Security=True;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
}
}
第七步:
在 startup类完成上下文类的注册和grpc服务的映射
using GrpcService.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using GrpcService.Services;
public IConfiguration Configuration { get; set; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
// 注册上下文类
services.AddDbContext<ShopContext>(options=> {
options.UseSqlServer(Configuration.GetConnectionString("ShopConStr"));
});
services.AddGrpc();
}
下面两句加在Configure中:
endpoints.MapGrpcService<GreeterService>();
// 添加grpc服务映射关系
endpoints.MapGrpcService<ShopService>();
第八步:
在Services文件夹新建ShopService类,完成方法的实现
public class ShopService:ProductManager.ProductManagerBase // 对应的是protobuf文件的服务名称
{
private readonly ShopContext _context;
private readonly ILogger<ShopService> _logger;
public ShopService(ShopContext context,ILogger<ShopService> logger) // 依赖注入
{
_context = context;
_logger = logger;
}
public override Task<ProductResponse> GetProductByID(ProductRequest request, ServerCallContext context)
{
// 定义输出参数
var res = new ProductResponse();
// 书写查询语句
var pro = _context.Products.Where(p=>p.ProductId==request.Id).Select(p => new ProductInfo
{
ProductId = p.ProductId,
ProductDesc = p.ProductDesc,
ProductImg = p.ProductImg,
ProductName = p.ProductName
}
).FirstOrDefault();
_logger.LogInformation("已经开始读取数据库的数据");
// 将查询结果赋值给输出参数
res.Product = pro;
// 返回结果
return Task.FromResult(res);
}
public override Task<ProductListResponse> GetProductList(Empty request, ServerCallContext context)
{
// 定义输出参数
var res = new ProductListResponse();
// 书写查询语句
var list = _context.Products.Select(p=>new ProductInfo
{
ProductId=p.ProductId,
ProductDesc=p.ProductDesc,
ProductImg=p.ProductImg,
ProductName=p.ProductName
}
).ToArray();
_logger.LogInformation("已经开始读取数据库的数据");
_logger.LogInformation($"list有{list.Length}条");
// 将查询结果赋值给输出参数
res.Product.Add(list);
// 返回结果
return Task.FromResult(res);
}
}
【注意】 protobuf文件命名空间与服务类文件命名空间一致
——————————————————————————————————
以上就完成了Grpc服务器的配置,接下来是客户端
创建gRPC客户端:
1) 使用VS2019创建MVC项目
2) 打开服务器的项目在文件夹中复制Protos文件中文件到该项目中
3) 添加protobuf文件的客户端服务引用(与创建服务器的第五步一样,不过在这次是选客服端),并生成代理类
4) 创建gRPC客户端代理对象并调用gRPC方法
【注意】 客户端的端口号不要和服务器的端口号冲突
具体步骤:
- 复制服务器的protos文件夹到客户端的项目上
- 添加grpc服务,注意是客户端
- 在控制器Index()操作方法上完成代码;记得先添加
using Grpc.Net.Client;引用
//查集合
public IActionResult Index()
{
// 创建服务器的信道
var channel = GrpcChannel.ForAddress("https://localhost:5001");
// 创建客户端
GrpcService.ProductManager.ProductManagerClient client = new GrpcService.ProductManager.ProductManagerClient(channel);
// 调用相应的方法
var list = client.GetProductList(new Google.Protobuf.WellKnownTypes.Empty());
// 模型传值
return View(list.Product.ToList());
}
//查对象
public IActionResult Index()
{
// 创建服务器的信道
var channel = GrpcChannel.ForAddress("https://localhost:5001");
// 创建客户端
GrpcService.ProductManager.ProductManagerClient client = new GrpcService.ProductManager.ProductManagerClient(channel);
// 调用相应的方法
var pro = client.GetProductByID(new GrpcService.ProductRequest { Id=1023});//id值看你数据库的id
// 模型传值
return View(pro.Product);
}
查集合的视图:
<div class="text-center">
@foreach (var item in Model)
{
<dl>
<dt>
@item.ProductId
</dt>
<dd>
@item.ProductName
</dd>
<dd>@item.ProductDesc</dd>
</dl>
}
</div>
完毕完毕!!引用请备注出处,我写这个是真不容易,哭哭