public Response <GrpcRequest> BuildRequest(DownstreamContext context) { var route = context.DownstreamRequest.AbsolutePath.Trim('/').Split('/'); if (route.Length != 2) { return(SetError($"error request:{route},must do like this:http://domain:port/grpc/ServiceName/MethordName/")); } string svcName = route[0].ToUpper(); string methodName = route[1].ToUpper(); //判断是否存在对应grpc服务、方法 var grpcDescript = grpcServiceDescriptor.GetGrpcDescript(); if (!grpcDescript.ContainsKey(svcName)) { return(SetError($"service name is not defined.{svcName}")); } if (!grpcDescript[svcName].ContainsKey(methodName)) { return(SetError($"method name is not defined.{methodName}")); } GrpcRequest grpcRequest = new GrpcRequest { GrpcMethod = grpcDescript[svcName][methodName] }; try { //需要替换Scheme context.DownstreamRequest.Scheme = "http"; var requestMessage = context.DownstreamRequest.ToHttpRequestMessage(); var stream = requestMessage.Content.ReadAsStreamAsync().Result; var encoding = context.HttpContext.Request.GetTypedHeaders().ContentType?.Encoding ?? Encoding.UTF8; using (var reader = new StreamReader(stream, encoding)) { grpcRequest.RequestMessage = reader.ReadToEnd(); } //兼容请求参数为空 if (string.IsNullOrEmpty(grpcRequest.RequestMessage)) { grpcRequest.RequestMessage = "{}"; } } catch (Exception) { return(SetError("request parameter error")); } context.DownstreamRequest.Scheme = "grpc"; return(new OkResponse <GrpcRequest>(grpcRequest)); }
public Response <GrpcRequest> BuildRequest(DownstreamContext context) { var route = context.DownstreamRequest.AbsolutePath.Trim('/').Split('/'); if (route.Length != 2) { return(SetError($"error request:{route},must do like this:http://domain:port/grpc/ServiceName/MethordName/")); } string svcName = route[0].ToUpper(); string methodName = route[1].ToUpper(); //判断是否存在对应grpc服务、方法 var grpcDescript = descriptor.Descriptor; if (!grpcDescript.ContainsKey(svcName)) { return(SetError($"service name is not defined.{svcName}")); } if (!grpcDescript[svcName].ContainsKey(methodName)) { return(SetError($"method name is not defined.{methodName}")); } GrpcRequest grpcRequest = new GrpcRequest { GrpcMethod = grpcDescript[svcName][methodName], Headers = GetRequestHeaders(context) }; try { //需要替换Scheme context.DownstreamRequest.Scheme = "http"; var requestJson = GetRequestJson(context); grpcRequest.RequestMessage = JsonConvert.DeserializeObject(requestJson, grpcRequest.GrpcMethod.InputType.ClrType); } catch (Exception) { return(SetError("request parameter error")); } context.DownstreamRequest.Scheme = "grpc"; return(new OkResponse <GrpcRequest>(grpcRequest)); }