低调的骏马 2022-09-08 03:15 采纳率: 50%
浏览 13
已结题

在grpc中传递上下文信息,但是在下一个中间件里却获取不到

#问题:在grpc中传递上下文信息,但是在下一个中间件里却获取不到

#情况如下:
做了删减,大概逻辑是这样的,通过md.Set方法插入值后,debug确实可以找到信息,但是在第15行handler(srv, ss)执行下一个中间件时

func GrpcJwtAuthTokenMiddleware(serviceDetail *dao.ServiceDetail) func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
    return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
        md, ok := metadata.FromIncomingContext(ss.Context())
        if !ok {
            return errors.New("miss metadata from context")
        }
        appList := dao.AppManagerHandler.GetAppList()
        for _, appInfo := range appList {
            if appInfo.AppID == claims.Issuer {
                md.Set("app", public.Obj2Json(appInfo))
                break
            }
        }
        if err := handler(srv, ss); err != nil {
            log.Printf("GrpcJwtAuthTokenMiddleware failed with error %v\n", err)
            return err
        }
        return nil
    }
}

在这里metadata.FromIncomingContext()获取上下文信息后,使用md.Get("app")获取的值却为空,debug发现 md, ok := metadata.FromIncomingContext(ss.Context())此方法获取的map中并没有上个中间件set进的"app"信息,请问这种情况是否有有效的解决方法

func GrpcJwtFlowCountMiddleware(serviceDetail *dao.ServiceDetail) func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
    return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
        md, ok := metadata.FromIncomingContext(ss.Context())
        if !ok {
            return errors.New("miss metadata from context")
        }
        appInfos := md.Get("app")    
    }
}

展开全部

  • 写回答

1条回答 默认 最新

  • 低调的骏马 2022-09-08 03:59
    关注

    问题初步解决了,我降低版本从google.golang.org/grpc v1.49.0 // indirect降低到google.golang.org/grpc v1.36.1,现在取得app信息了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 9月15日
  • 已采纳回答 9月8日
  • 修改了问题 9月8日
  • 创建了问题 9月8日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部