我开发了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;
}
}
我在做什么错?
我看到的几件事:
首先,您的异常处理程序将忽略该异常并引发新的异常。为您的TaskCanceledException
分配一个变量,并在抛出新异常之前记录该实际异常。内部异常可能会为您提供有关所发生情况的更多信息。
catch (TaskCancelledException e))
{
Debug.WriteLine(e);
//do whatever else
}
旁注:使用new HttpResponseMessage(HttpStatusCode.RequestTimeout)
可能不是最合适的方法。这使得服务器看起来像返回了408 Request Timeout。当那不是真的发生时。
[超时将引发TaskCanceledException
是客户端发送请求,但未在预期的时间内(默认为30秒)收到来自服务器的响应。
如果这确实是发生的超时,那么您可能必须查看Wireshark或Fiddler之类的内容,以验证请求是否已实际发送。然后,您必须弄清楚该请求和重新启动应用程序后发送的请求之间的区别。
例如,您的令牌是否已过期,并且重新启动您的应用程序请求一个新的令牌? (不应导致超时,但是如果服务器代码编写不正确,则可能会导致超时)]