/// <summary>异步调用,等待返回结果</summary> /// <typeparam name="TResult">响应类型,优先原始字节数据,字典返回整体,Object返回data,没找到data时返回整体字典,其它对data反序列化</typeparam> /// <param name="client">Http客户端</param> /// <param name="method">请求方法</param> /// <param name="action">服务操作</param> /// <param name="args">参数</param> /// <param name="onRequest">请求头回调</param> /// <param name="dataName">数据字段名称,默认data。同一套rpc体系不同接口的code/message一致,但data可能不同</param> /// <returns></returns> public static async Task <TResult> InvokeAsync <TResult>(this HttpClient client, HttpMethod method, String action, Object args = null, Action <HttpRequestMessage> onRequest = null, String dataName = "data") { //if (client?.BaseAddress == null) throw new ArgumentNullException(nameof(client.BaseAddress)); var returnType = typeof(TResult); // 构建请求 var request = BuildRequest(method, action, args); // 指定返回类型 if (returnType == typeof(Byte[]) || returnType == typeof(Packet)) { request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream")); } else { request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); } // 可能附加头部 onRequest?.Invoke(request); // 开始跟踪,注入TraceId using var span = Tracer?.NewSpan(request); try { // 发起请求 Filter?.OnRequest(client, request, null); var response = await client.SendAsync(request); Filter?.OnResponse(client, response, null); return(await ProcessResponse <TResult>(response, dataName)); } catch (Exception ex) { // 跟踪异常 span?.SetError(ex, args); Filter?.OnError(client, ex, null); throw; } }