gRPC流拦截器未将上下文传递给请求方法

问题描述

我在服务器端运行以下gRPC拦截器,它包装了一个服务器流并将其传递给下一个处理程序:

// HarmonyContext contains a custom context for passing data from middleware to handlers
type HarmonyContext struct {
    context.Context
    Request interface{}
    UserID  uint64
    Limiter *rate.Limiter
}

type IHarmonyWrappedServerStream interface {
    GetWrappedContext() HarmonyContext
}

type HarmonyWrappedServerStream struct {
    grpc.ServerStream
    WrappedContext HarmonyContext
}

func (ss HarmonyWrappedServerStream) GetWrappedContext() HarmonyContext {
    return ss.WrappedContext
}

func (m Middlewares) HarmonyContextInterceptorStream(srv interface{},ss grpc.ServerStream,info *grpc.StreamServerInfo,handler grpc.StreamHandler) error {
    wrapped := WrapServerStream(ss)
    return handler(srv,wrapped)
}

func WrapServerStream(stream grpc.ServerStream) HarmonyWrappedServerStream {
    if existing,ok := stream.(HarmonyWrappedServerStream); ok {
        return existing
    }
    return HarmonyWrappedServerStream{ServerStream: stream,WrappedContext: HarmonyContext{
        Context: stream.Context(),}}
}

以及处理程序本身中的以下代码:

func (v1 *V1) StreamGuildEvents(r *corev1.StreamGuildEventsRequest,s corev1.CoreService_StreamGuildEventsServer) error {
    wrappedStream := s.(middleware.IHarmonyWrappedServerStream)
    println(wrappedStream)
    return nil
}

但是,发送流式请求时出现以下运行时错误: interface conversion: *corev1.coreServiceStreamGuildEventsServer is not middleware.IHarmonyWrappedServerStream: missing method GetWrappedContext 实际上,处理程序中的ServerStream与拦截器中的ServerStream完全不同。有什么方法可以使拦截器正确通过自定义ServerStream?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)