方法的抽象GreeterBase
类型。具体的实现GreeterService
重写该方法并实现处理GRPC调用的逻辑。
正如HelloGrpc.Server
项目中的Services\GreeterService.cs
中的代码
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply>
SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
对于客户端,将生成一个具体的客户端类型中的GRPC调用。.proto文件被转换为可以调用的具体类型上的方法。为greet.proto
前面描述的示例,一个具体的GreeterClient
类型生成。这个GreeterClient
类型包含SayHello
方法,可以调用该方法来启动对服务器的GRPC调用。
public class Program
{
static async Task Main(string[] args)
{
// Include port of the gRPC server as an application argument
var port = args.Length > 0 ? args[0] : "50051";
var channel = new Channel("localhost:" + port, 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();
}
}
默认情况下,分别生成服务器和客户端资产。.proto文件包含在<Protobuf>
项目组。若要确保仅在服务器项目中生成服务器资产,GrpcServices
属性设置为Server
.
XML复制
<ItemGroup>
<Protobuf Include="..\Protos\*.proto" GrpcServices="Server" />
<Content Include="@(Protobuf)" LinkBase="" />
</ItemGroup>
类似地,属性设置为Client
在仅在客户项目中生成。
Startup
在Startup
中我们发现跟普通的ASP.NET Core程序有所不同,具体的如下图所示:在ConfigureServices
服务中引入了gRPC服务,然后在Configure
加入了路由
而这里需要引入三个与gRPC相关的nuget包
这里需要说明的是
ASP.NET Core 中间件和功能共享路由管道,因此可以将应用程序配置为服务其他请求处理程序。其他请求处理程序(如MVC控制器)可以与配置的GRPC服务路由并行工作。
其他需要说明的内容
与ASP.NET Core 接口的集成
GRPC服务可以完全访问ASP.NETCore功能,如依赖注入(Di)和日志功能。例如,服务实现可以通过构造函数解析DI容器中的记录器服务:
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
默认情况下,GRPC服务可以解析具有任意生存期的其他DI服务(Singleton, Scoped, or Transient)。
在GRPC方法中解析HttpContext
GRPC 应用程序接口提供对某些HTTP/2消息数据的访问,例如method, host, header, and trailers。访问是通过ServerCallContext
参数传递给每个GRPC方法:
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply>
SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
ServerCallContext
不提供对所有ASP.NET 接口中HttpContext
的完全访问。GetHttpContext
扩展方法提供对表示ASP.NET API中底层HTTP/2消息的httpContext的完全访问:
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request,
ServerCallContext context)
{
var httpContext = context.GetHttpContext();
return Task.FromResult(new HelloReply
{
Message = "Using https: " + httpContext.Request.IsHttps
});
}
}
请求体数据速率限制
默认情况下,Kestrel服务器设置为最小请求主体数据速率。对于客户端流式和双工流式的请求,此速率可能不满足,并且连接可能超时。当GRPC服务包括客户端流和双工流调用时,必须禁用最小请求正文数据速率限制:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuild