0

我们正在对服务层进行 PUT 调用以更新实体信息

HttpClient.SendAsync 方法会引发“任务已取消”问题,即使 API 调用成功对后端服务层进行。我可以看到来自服务层的日志。

最初我认为它可能与超时有关,所以我将超时时间从 10 秒增加到 30 秒,但程序仍在等待 30 秒并因错误“任务已取消”而超时。但是 api 调用甚至在 5 秒内就在 Service Layer 中成功完成了

请在我的代码下面找到

    protected override void Execute(CodeActivityContext context)
    {
        string uuid = UUID.Get(context);

        Console.WriteLine(uuid + ": Http Api Call - STARTED");

        string endPoint = EndPoint.Get(context);
        string contentType = ContentType.Get(context);
        string acceptFormat = AcceptFormat.Get(context);
        HttpMethod httpMethod = HttpApiMethod.Get(context);
        string clientCertificatePath = ClientCertificatePath.Get(context);
        string clientCertificatePassword = ClientCertificatePassword.Get(context);
        double httpTimeOut = HttpTimeout.Get(context);
        Dictionary<string, string> requestHeaders = RequestHeaders.Get(context);
        Dictionary<string, string> pathParams = PathParams.Get(context);
        Dictionary<string, string> queryParams = QueryParams.Get(context);
        string requestBody = RequestBody.Get(context);


        WebRequestHandler webRequestHandler = new WebRequestHandler();
        webRequestHandler.MaxConnectionsPerServer = 1;

        if (clientCertificatePath != null && clientCertificatePath.Trim().Length > 0)
        {
            X509Certificate2 x509Certificate2 = null;
            if (clientCertificatePassword != null && clientCertificatePassword.Trim().Length > 0)
            {
                x509Certificate2 = new X509Certificate2(clientCertificatePath.Trim(),
                    clientCertificatePassword.Trim());
            }
            else
            {
                x509Certificate2 = new X509Certificate2(clientCertificatePath.Trim());
            }
            webRequestHandler.ClientCertificates.Add(x509Certificate2);
        }

        HttpClient httpClient = new HttpClient(webRequestHandler)
        {
            Timeout = TimeSpan.FromMilliseconds(httpTimeOut)
        };

        if (acceptFormat != null)
        {
            httpClient.DefaultRequestHeaders.Add("Accept", acceptFormat);
        }

        HttpResponseMessage httpResponseMessage = InvokeApiSync(httpClient, endPoint,
                                     httpMethod, contentType,
                                     requestHeaders, pathParams,
                                     queryParams, requestBody,
                                     uuid
                                     );

        HttpResponseMessageObject.Set(context, httpResponseMessage);
        ResponseBody.Set(context, httpResponseMessage.Content.ReadAsStringAsync().Result);
        StatusCode.Set(context, (int)httpResponseMessage.StatusCode);

        Console.WriteLine(uuid + ": Http Api Call - ENDED");
    }

    private HttpResponseMessage InvokeApiSync(HttpClient httpClient,
                            string endPoint,
                            HttpMethod httpMethod,
                            string contentType,
                            Dictionary<string, string> requestHeaders,
                            Dictionary<string, string> pathParams,
                            Dictionary<string, string> queryParams,
                            string requestBody,
                            string uuid)
    {
        if (pathParams != null)
        {
            ICollection<string> keys = pathParams.Keys;
            if (keys.Count > 0)
            {
                foreach (string key in keys)
                {
                    endPoint = endPoint.Replace(":" + key, pathParams[key]);
                }
            }
        }

        if (queryParams != null)
        {
            List<string> keys = new List<string>(queryParams.Keys);
            if (keys.Count > 0)
            {
                endPoint = string.Concat(endPoint, "?", keys[0], "=", queryParams[keys[0]]);
                for (int index = 1; index < keys.Count; index++)
                {
                    endPoint = string.Concat(endPoint, "&", keys[index], "=", queryParams[keys[index]]);
                }
            }
        }

        try
        {
            HttpRequestMessage httpRequestMessage = new HttpRequestMessage(httpMethod, endPoint);
            if (requestHeaders != null)
            {
                foreach (string key in requestHeaders.Keys)
                {
                    httpRequestMessage.Headers.Add(key, requestHeaders[key]);
                }
            }

            if (httpMethod.Equals(HttpMethod.Put) || httpMethod.Equals(HttpMethod.Post))
            {
                StringContent reqContent = null;
                if (requestBody != null)
                {
                    reqContent = new StringContent(requestBody);
                }
                else
                {
                    reqContent = new StringContent("");
                }

                reqContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
                httpRequestMessage.Content = reqContent;
            }

            HttpResponseMessage httpResponseMessage = httpClient.SendAsync(httpRequestMessage).Result;

            return httpResponseMessage;
        }
        catch (Exception exception)
        {
            Console.WriteLine(uuid + " : HttpApi Error Has Occurred");
            Console.WriteLine(uuid + " : " + exception.Message);
            Console.WriteLine(uuid + " : " + exception.StackTrace);
            throw exception;
        }
    }

任何帮助将非常感激。谢谢。!

4

0 回答 0