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();
        }
    }
相关推荐
MediaTea12 小时前
Python 第三方库:cv2(OpenCV 图像处理与计算机视觉库)
开发语言·图像处理·python·opencv·计算机视觉
世洋Blog12 小时前
Unity面经-List底层原理、如何基于数组、如何扩容、List存储泛型、List有关在内存中的结构
unity·面试·c#·list
初见无风12 小时前
4.4 Boost库工具类assign 的使用
开发语言·c++·boost
月夜的风吹雨12 小时前
【C++ STL容器适配器】:解密Stack、Queue与Priority Queue的设计智慧
开发语言·c++·stl·优先级队列··队列·适配器
二川bro12 小时前
第45节:分布式渲染:Web Workers多线程渲染优化
开发语言·javascript·ecmascript
2501_9411119313 小时前
基于C++的区块链实现
开发语言·c++·算法
czxyvX13 小时前
010-C++之List
开发语言·c++·list
小艳加油13 小时前
生态学研究突破:利用R语言多元算法实现物种气候生态位动态分析与分布预测,涵盖数据清洗、模型评价到论文写作全流程
开发语言·算法·r语言
程序猿_极客13 小时前
【2025 最新】 Maven 下载安装与配置教程(超详细带图文Windows 版):从入门到实战
java·开发语言·windows·maven·maven安装
励志前端小黑哥13 小时前
uv包管理器--python也有自己的pnpm了
开发语言·python·uv