httpClient.GetAsync()超时异常,如果应用程序长时间闲置

问题描述 投票:0回答:1

我开发了C# .net 4.6.1应用程序。在应用程序中,我使用HttpClient与我们的后端API通信。随着时间的流逝,应用程序未将请求发送到我们的后端(捕获到超时异常)。重新启动应用程序后,发送请求。

这是我们的代码段。

class Program
{
  static void Main(string[] args)
  {
    MyClass myClass = GetAsync().Result;
  }

  private static async Task<MyClass> GetAsync()
  {
     MyClassResponse myClassResponse = await TestHttpClient.GetMyClassResponse();
    return MyClass.Create(myClassResponse);
  }
}
public static class TestHttpClient
{
   private static HttpClient _httpClient;

   public static void Init()
   {
     _httpClient = CreateHttpClient();
   }

   public static async Task<MyClassResponse> GetMyClassResponse()
   {
      HttpResponseMessage response = await GetRequestAsync("https://....");
      return await ParseToMyClassResponse<MyClassResponse>(response);
   }

   private static HttpClient CreateHttpClient()
   {
      HttpClient client = new HttpClient();
      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("token .....");
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
      client.Timeout = TimeSpan.FromMilliseconds(10000);
      return client;
    }

    private static async Task<HttpResponseMessage> GetRequestAsync(string url)
   {
        try
        {
           return await _httpClient.GetAsync(new Uri(url));
         }
         catch (TaskCanceledException)
         {
          return new HttpResponseMessage(HttpStatusCode.RequestTimeout);
         }
    }

    private static async Task<T> ParseToMyClassResponse<T>(HttpResponseMessage response) where T : MyClassResponse, new()
        {
            T myClassResponse;
            try
            {
                string content = await response.Content.ReadAsStringAsync();
                response.EnsureSuccessStatusCode();
                myClassResponse = JsonConvert.DeserializeObject<T>(content);
                           }
            catch (Exception ex)
            {
                myClassResponse = new T();
            }

            response.Dispose();
            return myClassResponse;
        }
}

我在做什么错?

c# .net async-await dotnet-httpclient get-request
1个回答
0
投票

我看到的几件事:

首先,您的异常处理程序将忽略该异常并引发新的异常。为您的TaskCanceledException分配一个变量,并在抛出新异常之前记录该实际异常。内部异常可能会为您提供有关所发生情况的更多信息。

catch (TaskCancelledException e))
{
    Debug.WriteLine(e);
    //do whatever else
}

旁注:使用new HttpResponseMessage(HttpStatusCode.RequestTimeout)可能不是最合适的方法。这使得服务器看起来像返回了408 Request Timeout。当那不是真的发生时。

[超时将引发TaskCanceledException是客户端发送请求,但未在预期的时间内(默认为30秒)收到来自服务器的响应。

如果这确实是发生的超时,那么您可能必须查看WiresharkFiddler之类的内容,以验证请求是否已实际发送。然后,您必须弄清楚该请求和重新启动应用程序后发送的请求之间的区别。

例如,您的令牌是否已过期,并且重新启动您的应用程序请求一个新的令牌? (不应导致超时,但是如果服务器代码编写不正确,则可能会导致超时)]

© www.soinside.com 2019 - 2024. All rights reserved.