c# Grpc取消

net6.0

通过CancellationTokenSource 客户端取消Grpc,服务端判断 IsCancellationRequested 是否取消。

proto:

复制代码
syntax = "proto3";

// 引用可空类型
import "google/protobuf/wrappers.proto";

option csharp_namespace = "Grpc.Common";

package greet;


// The greeting service definition.
service Greeter {
  rpc StreamApi (HelloRequest) returns (stream HelloResponse);
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

服务端:

nuget包:Grpc.AspNetCore、Grpc.AspNetCore.Server.Reflection

GreeterService.cs

cs 复制代码
using Grpc.Core;
using Grpc.Common;
    
    public class GreeterService : Greeter.GreeterBase
    {
        private readonly ILogger<GreeterService> _logger;
        public GreeterService(ILogger<GreeterService> logger)
        {
            _logger = logger;
        }

        public override async Task StreamApi(HelloRequest request, IServerStreamWriter<HelloResponse> responseStream, ServerCallContext context)
        {
            try
            {
                for (var i = 0; i < 50; i++)
                {
                    if (context.CancellationToken.IsCancellationRequested)
                    {
                          await responseStream.WriteAsync(new HelloResponse
                            {
                                Message = i.ToString()
                            });
                            await Task.Delay(1000 * 3);
                    }
                }
            }
            catch (OperationCanceledException ex)
            {
                throw;
            }
        }
    }

program:

cs 复制代码
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Additional configuration is required to successfully run gRPC on macOS.
            // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682

            // Add services to the container.
            builder.Services.AddGrpc();

            builder.Services.AddGrpcReflection();//添加gRPC反射

            var app = builder.Build();

            IWebHostEnvironment env = app.Environment;
            // Configure the HTTP request pipeline.
            app.MapGrpcService<GreeterService>();

            if (env.IsDevelopment())
            {
                //映射gRPC反射服务
                app.MapGrpcReflectionService();
            }

            app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");

            app.Run();
        }
    }

客户端:

nuget包:Google.Protobuf、Grpc.Net.Client、Grpc.Net.ClientFactory、Grpc.Tools

GreeterService.cs

cs 复制代码
public class GreeterService
{
    private readonly GreeterClient _greeterClient;
    public GreeterService(GreeterClient greeterClient)
    {
        _greeterClient = greeterClient;
    }
   
    private static CancellationTokenSource ProbeLoopCancellationTokenSource = new CancellationTokenSource();

    public async Task StreamApiAsync(HelloRequest request)
    {
        using var call = _greeterClient.StreamApi(request, cancellationToken: ProbeLoopCancellationTokenSource.Token);
        await foreach (var response in call.ResponseStream.ReadAllAsync())
        {
            Console.WriteLine(response.Message);
        }
    }

    public async Task CancleAsync()
    {
        ProbeLoopCancellationTokenSource.Cancel();
    }
}

program:

cs 复制代码
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            builder.Services.AddTransient<GreeterService>();

            builder.Services.AddGrpcClient<GreeterClient>(options =>
            {
                options.Address = new Uri("http://localhost:5047");
                options.ChannelOptionsActions.Add(channelOption =>
                {
                    channelOption.HttpHandler = new SocketsHttpHandler
                    {
                        EnableMultipleHttp2Connections = true
                    };
                });
                //配置请求超时自动取消时间 发起请求到服务端后xxx秒后自动取消
                //options.CallOptionsActions.Add(callOptionsAction =>
                //{
                //    callOptionsAction.CallOptions = new CallOptions(deadline: DateTime.UtcNow.AddSeconds(xx));
                //});
            });

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
相关推荐
LONGZETECH1 小时前
无人机组装调试实训高损耗痛点分析与虚拟仿真教学落地方案
c语言·开发语言·架构·无人机
菜冻鱼2 小时前
Python-sklearn-降维
开发语言·人工智能·python·机器学习·支持向量机·sklearn
luj_17682 小时前
大航海时代:沉浸式财商实战沙盒
c语言·开发语言·网络·经验分享·算法
赵广陆2 小时前
企业实战:Markdown图片检索
android·java·开发语言
C++、Java和Python的菜鸟2 小时前
第3章 从0开始用若依
java·开发语言
夜雪一千3 小时前
Python 如何实现 SHA 加密?SHA1 / SHA256 / SHA512 实战教程
开发语言·python
摸鱼停不住先生3 小时前
不安全反序列化利用篇(四):预构建 Gadget Chain——从反序列化检测到框架利用
开发语言·python·安全
有点。3 小时前
C++二叉树(一)
开发语言·数据结构·c++
民乐团扒谱机3 小时前
【微实验】谐波乘积谱(HPS)算法深度解析:原理、数学与代码实现
开发语言·人工智能·python·算法·语音识别·音乐
报错小能手4 小时前
Go 语言结构 基础语法
开发语言·后端·golang