首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从托管在Azure中的Asp.net Core应用程序中获取“响应状态代码并不表示成功: 502 (坏网关)”

从托管在Azure中的Asp.net Core应用程序中获取“响应状态代码并不表示成功: 502 (坏网关)”
EN

Stack Overflow用户
提问于 2020-01-12 08:23:11
回答 2查看 10.8K关注 0票数 1

我有一个基于Asp.net核心MVC的客户端应用程序(V1.1.1)和一个基于Asp.net核心的Web (V2.1)。我在Azure主持了这两个节目。

在发出一些请求时,这个web应用程序失败了,给了502个不好的网关响应。

响应状态代码并不表示成功: 502 (坏网关)。 指定的CGI应用程序遇到错误,服务器终止该进程。

这个问题是断断续续的,然而,当请求需要超过2分钟的时间处理时,似乎就会发生。我已经将requestTimeout设置为Web.config文件中的客户端和API端的20分钟,但仍未得到解决。有时,同样的请求在较短的时间内被处理,而我正在得到响应。

此外,Httpclient的5分钟超时也已设置,但没有运气。

<aspNetCore requestTimeout="00:20:00"/>

_httpClient.Timeout = new TimeSpan(0, 5, 0);

我已经测试了当地的应用程序,不能面对这个问题,也能够得到响应,即使它需要超过3分钟的处理。

看起来,Azure web应用程序并不是等待请求被处理,如果它跨越2分钟。然而,蔚蓝会话超时指定230秒(3.8min),但它仍然没有等待,应用程序没有将此情况视为错误,也没有记录任何内容。

客户端代码:

代码语言:javascript
复制
public class ApiClientFactory
{
    private static Uri ApiUrl;
    private static Lazy<ApiClient> restClient = new Lazy<ApiClient>(
        () => new ApiClient(ApiUrl),
        LazyThreadSafetyMode.ExecutionAndPublication);

    static ApiClientFactory()
    {
        ApiUrl = new Uri(Convert.ToString(ConfigurationManager.AppSettings["WebAPIUrl"]));
    }

    public static ApiClient Instance
    {
        get
        {
            return restClient.Value;
        }
    }
}
代码语言:javascript
复制
public class ApiClient
{
   private readonly HttpClient _httpClient;
   private readonly Uri BaseEndPointUrl;

   public ApiClient(Uri baseEndPointUrl)
   {
       if (baseEndPointUrl == null)
           throw new ArgumentNullException("baseEndPointUrl");

       BaseEndPointUrl = baseEndPointUrl;
       _httpClient = new HttpClient();
       _httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
       _httpClient.Timeout = new TimeSpan(0, 5, 0); //Timeout needed for few modules to get results from db.
   }

   private HttpContent CreateHttpContent<T>(T content)
   {
       var json = JsonConvert.SerializeObject(content, MicrosoftDateFormatSettings);
       return new StringContent(json, Encoding.UTF8, "application/json");
   }

   private static JsonSerializerSettings MicrosoftDateFormatSettings
   {
       get
       {
           return new JsonSerializerSettings
           {
               DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
           };
       }
   }

   public async Task<T1> PostAsync<T1, T2>(string url, T2 content, string token)
   {
       try
       {
           _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
           var response = await _httpClient.PostAsync(url, CreateHttpContent<T2>(content));

           if (response.StatusCode == HttpStatusCode.InternalServerError){
               var exception = await response.Content.ReadAsStringAsync();
               throw new Exception(exception);
           }
           response.EnsureSuccessStatusCode();
           var data = await response.Content.ReadAsStringAsync();

           return JsonConvert.DeserializeObject<T1>(data);
       }
       catch (Exception ex){throw ex;}
   }
}

如果有问题,请协助。

EN

回答 2

Stack Overflow用户

发布于 2020-06-01 18:17:41

您可以实现重试请求的方法,或者只需对此类错误使用.Net 波莉。不是增加超时设置的好做法。

方法

代码语言:javascript
复制
    private async Task<bool> PostAsync()//Params you need
    {
        HttpStatusCode[] httpStatusCodesWorthRetrying =
        {
            HttpStatusCode.RequestTimeout,
            HttpStatusCode.InternalServerError,
            HttpStatusCode.BadGateway,
            HttpStatusCode.ServiceUnavailable,
            HttpStatusCode.GatewayTimeout
        };

        var maxAttempts = 0;

        while (maxAttempts < 3)
        {
            var response =  await _httpClient.PostAsync(requestUrl, CreateHttpContent<T2>(content));
            if (!httpStatusCodesWorthRetrying.Contains(response.StatusCode))
            {
                return true;
            }

            maxAttempts ++;
            await Task.Delay(300);
        }
        return false;
    }

Polly

代码语言:javascript
复制
    private async Task PostAsync()//Params you need
    {
        HttpStatusCode[] httpStatusCodesWorthRetrying =
        {
            HttpStatusCode.RequestTimeout,
            HttpStatusCode.InternalServerError,
            HttpStatusCode.BadGateway,
            HttpStatusCode.ServiceUnavailable,
            HttpStatusCode.GatewayTimeout
        };


        _retryPolicy = Policy
            .Handle<HttpRequestException>()
            .OrResult<HttpResponseMessage>(r => httpStatusCodesWorthRetrying.Contains(r.StatusCode))
            .WaitAndRetry(4, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

        _retryPolicy.Execute(await _httpClient.PostAsync(requestUrl, CreateHttpContent<T2>(content)));

    }
票数 2
EN

Stack Overflow用户

发布于 2020-01-20 12:01:41

我们认为可能的原因有以下几点。

  1. 在测试时,在处理给定请求和传递响应时,两个托管应用程序之间的网络相关问题。在API交付响应之前,Web应用程序可能会超时。
  2. 在API客户端类中进行以下代码更改。(发布在问题中).I不确定等待任务的和从任务获取结果之间有什么细微的区别。但是在这个改变之后,我们不再经历这个问题,另外也做了一些负载测试,但是以后仍然没有面对这个问题。

从…

代码语言:javascript
复制
var response =  await _httpClient.PostAsync(requestUrl, CreateHttpContent<T2>(content));

代码语言:javascript
复制
var response =  _httpClient.PostAsync(requestUrl, CreateHttpContent<T2>(content)).Result;

注释:为Azure中的托管域启用分析选项的将为缩小这类问题提供很好的见解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59702119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档