Ai
1 Star 0 Fork 0

hardstylewyl/GRPC_Samples

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
ServerLoggerInterceptor.cs 3.69 KB
一键复制 编辑 原始数据 按行查看 历史
hardstylewyl 提交于 2025-01-05 21:49 +08:00 . 初始化grpc微软库的基本使用
using Grpc.Core;
using Grpc.Core.Interceptors;
//Interceptor 【客户端】调用重写以下项:
//BlockingUnaryCall:截获一元 RPC 的阻塞调用。
//AsyncUnaryCall:截获一元 RPC 的异步调用。
//AsyncClientStreamingCall:截获客户端流式处理 RPC 的异步调用。
//AsyncServerStreamingCall:截获服务器流式处理 RPC 的异步调用。
//AsyncDuplexStreamingCall:截获双向流式处理 RPC 的异步调用。
//Interceptor 【服务器】响应侦听器,重写以下项:
//UnaryServerHandler:截获一元 RPC。
//ClientStreamingServerHandler:截获客户端流式处理 RPC。
//ServerStreamingServerHandler:截获服务器流式处理 RPC。
//DuplexStreamingServerHandler:截获双向流式处理 RPC
public class ServerLoggerInterceptor : Interceptor
{
private readonly ILogger<ServerLoggerInterceptor> _logger;
public ServerLoggerInterceptor(ILogger<ServerLoggerInterceptor> logger)
{
_logger = logger;
}
public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(
TRequest request,
ServerCallContext context,
UnaryServerMethod<TRequest, TResponse> continuation)
{
LogCall<TRequest, TResponse>(MethodType.Unary, context);
try
{
return await continuation(request, context);
}
catch (Exception ex)
{
// Note: The gRPC framework also logs exceptions thrown by handlers to .NET Core logging.
_logger.LogError(ex, $"Error thrown by {context.Method}.");
throw;
}
}
public override Task<TResponse> ClientStreamingServerHandler<TRequest, TResponse>(
IAsyncStreamReader<TRequest> requestStream,
ServerCallContext context,
ClientStreamingServerMethod<TRequest, TResponse> continuation)
{
LogCall<TRequest, TResponse>(MethodType.ClientStreaming, context);
return base.ClientStreamingServerHandler(requestStream, context, continuation);
}
public override Task ServerStreamingServerHandler<TRequest, TResponse>(
TRequest request,
IServerStreamWriter<TResponse> responseStream,
ServerCallContext context,
ServerStreamingServerMethod<TRequest, TResponse> continuation)
{
LogCall<TRequest, TResponse>(MethodType.ServerStreaming, context);
return base.ServerStreamingServerHandler(request, responseStream, context, continuation);
}
public override Task DuplexStreamingServerHandler<TRequest, TResponse>(
IAsyncStreamReader<TRequest> requestStream,
IServerStreamWriter<TResponse> responseStream,
ServerCallContext context,
DuplexStreamingServerMethod<TRequest, TResponse> continuation)
{
LogCall<TRequest, TResponse>(MethodType.DuplexStreaming, context);
return base.DuplexStreamingServerHandler(requestStream, responseStream, context, continuation);
}
private void LogCall<TRequest, TResponse>(MethodType methodType, ServerCallContext context)
where TRequest : class
where TResponse : class
{
_logger.LogWarning($"Starting call. Type: {methodType}. Request: {typeof(TRequest)}. Response: {typeof(TResponse)}");
WriteMetadata(context.RequestHeaders, "caller-user");
WriteMetadata(context.RequestHeaders, "caller-machine");
WriteMetadata(context.RequestHeaders, "caller-os");
void WriteMetadata(Metadata headers, string key)
{
var headerValue = headers.GetValue(key) ?? "(unknown)";
_logger.LogWarning($"{key}: {headerValue}");
}
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/hardstylewyl/grpc_samples.git
git@gitee.com:hardstylewyl/grpc_samples.git
hardstylewyl
grpc_samples
GRPC_Samples
master

搜索帮助