服务器端
新建gRPC项目
右键Protos
文件夹–>新建一个.proto
,选择协议缓冲区文件,用于描述gRPC的消息和服务
名字随便取,这里就叫UpImg
吧
然后把包名,服务名称,参数和返回值名称都修改一下
把默认的方法名SayHello
和参数与返回值也修改一下
修改成我们自己定义的参数和返回值
新建一个UpImgService
,实现我们刚刚上面定义的gRPC
服务描述UpImg.proto
注意直接实现是找不到新建的服务的
因为还没有在obj\Debug\netcoreapp3.0下面生成相应的类
需要双击我们项目编辑csproj
文件,把新建的UpImg.proto
加入到配置中
加入配置中后保存一下在obj\Debug\netcoreapp3.0
中即可生成相应的类
然后继续实现UpImg.proto
,实现很简单注意参数和返回值即可
客户端
客户端需要添加包:Grpc.Net.Client、Google.Protobuf、Grpc.Tools
<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.11.2" />
<PackageReference Include="Grpc.Net.Client" Version="2.26.0" />
<PackageReference Include="Grpc.Tools" Version="2.26.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
把UpImg.proto
复制到客户端中的Proto
(这里使用的是直接复制进去)
同样在客户端加入配置,加入配置和客户端会自动生成相应的代码
然后调用即可:
public async void UpLoad()
{
//设置允许不安全的HTTP2支持
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
var channel = GrpcChannel.ForAddress("http://localhost:50001");
var client = new UpImg.UpImgClient(channel);
var reply = await client.DoUpLoadAsync(new UpImgRequest { Img = "hello girl" });
Console.WriteLine(reply.Message);
}
gRPC
调用由于目标计算机积极拒绝,无法连接。
修改端口设置,可能是https造成的
代码:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(options => {
options.ListenLocalhost(8099,a=>a.Protocols= Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2);
});
webBuilder.UseStartup<Startup>();
});
还有可能出错Grpc.Core.RpcException:“Status(StatusCode=Unimplemented, Detail="Service is unimplemented.")”
以为你还没有启动你调用的那个服务