.net5 gRPC支持swagger 同时支持grpc和webapi
原创
©著作权归作者所有:来自51CTO博客作者ives404的原创作品,请联系作者获取转载授权,否则将追究法律责任
- 安装对应的nuget - 目前只有previce版本
- Microsoft.AspNetCore.Grpc.HttpApi
- Microsoft.AspNetCore.Grpc.Swagge
- program.cs中调整监听端口同时支持http1和http2
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureKestrel(kerstrel =>
{
kerstrel.Listen(IPAddress.Any, 5003, o => o.Protocols = HttpProtocols.Http2);
kerstrel.Listen(IPAddress.Any, 5000, o => o.Protocols = HttpProtocols.Http1AndHttp2);
});
});
- Startup.cs中配置服务
ConfigureServices中添加
services.AddGrpc();
services.AddGrpcHttpApi();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
});
services.AddGrpcSwagger();
Configure中添加
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});
- proto文件中添加http1路由信息
4.1 添加import
import "google/api/annotations.proto";
4.2 添加http访问方式信息
原来的方法为
rpc SayHello (HelloRequest) returns (HelloReply);
将原方法调整为
rpc SayHello (HelloRequest) returns (HelloReply){
option (google.api.http) = {
get: "/v1/greeter/{name}"
};
}
- 将import需要使用的几个proto文件放到代码中与Protos目录同级的对应google目录中,如下,不用在项目中引用文件
├─google
│ ├─api
│ └─protobuf
├─Properties
├─Protos
└─Services
启动swagger即可
!注意配置http url信息时参数需要与定义的参数一致
最好将http1和http2端口分开,另外在客户端记得将proto文件中添加的导入和http1信息删除
此外在测试过程中遇到客户端无法生成的情况
报错
未能使用“ProtoCompile”任务的输入参数初始化该任务
从路径 C:\Users\xx\.nuget\packages\grpc.tools\2.34.0\build\_protobuf\net45\Protobuf.MSBuild.dll 处的程序集 Protobuf.MSBuild, Version=0.0.0.0, Culture=neutral, PublicKeyToken=d754f35622e28bad 加载的“ProtoCompile”任务不支持“AdditionalProtocArguments”参数。请验证任务上是否存在该参数、<UsingTask> 是否指向正确的程序集,以及它是否是可设置的公共实例属性。
需要调整Grpc.Tools包为2.34.0