private void ProcessEvent(BasicDeliverEventArgs ea) { _qps.Add("r"); var header = new HeadersAnalysis(ea.Body); var clienttime = header.ClientDate; var span = Math.Abs((DateTime.Now - clienttime).TotalMilliseconds); if (Configs.Delay != 0 && span > Configs.Delay * 1000) { ReplayTo(header.Url, DateTime.Now, ea, 402, $"请求已超时 请求 {ea.RoutingKey} 耗时 {span.ToString()}ms", ContentType.Text); return; } var action = _routing.Route(header.Url.AbsolutePath); if (action == null) { ReplayTo(header.Url, DateTime.Now, ea, 401, "未找到匹配请求的控制器或方法", ContentType.Text); return; } var reques = new Request() { Headers = header.Headers, Action = action, Url = header.Url, Seralize = RPCWrite.CreateSeralize(header.ContentType, header.Encode), ContentLength = header.ContentLength, Body = header.GetBodys() }; Excute(reques, ea); }
public async Task <ResponseBase <TOut> > CallAsync <Tin, TOut>(string uri, Tin data, ContentType type) { var datas = new byte[2000]; var write = new RPCWrite(datas, Encode); var encoding = "encoding:" + Encode.WebName; write.WriteString(encoding); var url = "url:" + "rpc://" + ServerId + uri; write.WriteString(url); var now = "clientTime:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); write.WriteString(now); var contenttype = "content-type:" + GetContentTypeName(type); write.WriteString(contenttype); write.WriteContent(type, data, typeof(Tin)); var t1 = mqRpc.Request(ServerId, write.GetDatas(), out _); var t2 = Task.Delay(TimeOut * 1000); await Task.WhenAny(new Task[] { t1, t2 }); if (!t1.IsCompletedSuccessfully) { return new ResponseBase <TOut>() { ServerState = -1, ServerMsg = "请求超时" } } ; var rsp = t1.Result; var analysis = new HeadersAnalysis(rsp); var seralize = CreateSeralize(analysis.ContentType, analysis.Encode); var res = seralize.DeserializeObject(analysis.GetBodys(), typeof(TOut)); var state = int.Parse(analysis.Headers["state"]); var msg = analysis.Headers["msg"]; if (state == 200) { return new ResponseBase <TOut> { ServerState = state, ServerMsg = msg, Data = (TOut)res } } ; return(new ResponseBase <TOut> { ServerState = state, ServerMsg = msg, Data = default });