Esempio n. 1
0
        /// <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;
            }
        }