设为首页 加入收藏

TOP

ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)(二)
2019-09-17 18:57:26 】 浏览:244
Tags:ASP.NET Core 3.0 gRPC 服务 模板 体验 多图
方法的抽象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加入了路由

1554014291599

而这里需要引入三个与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
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用cookie时出现“未将对象引用.. 下一篇DS控件库 一个简单的血条颜色渐变..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目