首页 > 解决方案 > httpclient异常处理

问题描述

我在HttpRequestException使用时正在处理PostAsync并且它工作正常,但是当我试图处理相同的异常时,GetAsync它会抛出TaskCanceledException a task was cancelled一个很长的超时时间。我该如何GetAsync投掷HttpRequestException

  public async Task<bool> AddQrCodeToRequest(int projectId, int requestId, string code, string token)
    {
        var data = JsonConvert.SerializeObject(new { code });
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        var content = new StringContent(data, Encoding.UTF8, "application/json");
        var result = await client.PostAsync(url, content);
        if (result.IsSuccessStatusCode)
        {
            return true;
        }
        else
        {
            throw new Exception(CreateExceptionDescription(await result.Content.ReadAsStringAsync()));
        }
    }

    public async Task<List<string>> GetUpdatedQrCodesList(Request request, string token)
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        var result = await client.GetAsync(url);
        if (result.IsSuccessStatusCode)
        {
            var requestsJson = await result.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<List<string>>(requestsJson);
        }
        else
        {
            throw new Exception(CreateExceptionDescription(await result.Content.ReadAsStringAsync()));
        }
    }

处理岗位

try
{
     string QrCode = result.Text;
     if (await restService.AddQrCodeToRequest(Request, result.Text, Vars.User.Token))
     {
          QrCodes.Add(QrCode);
          await DisplayAlert("Code added", QrCode, "OK");
     }
 }
 catch (Exception ex)
 {
     if (ex is HttpRequestException)
     {
           //network ex handling
     }
     else
     {
           //other handling
     }
}

处理获取(超时后应用程序崩溃)

        try
        {
            UpdatedQrCodes = await restService.GetUpdatedQrCodesList(Request, Vars.User.Token);
        }
        catch (Exception ex)
        {
            if (ex is HttpRequestException)
            {
                //never thrown
            }
            else
            {
                //never also thrown
            }
        }

标签: c#restxamarinhttpclient

解决方案


作为一种解决方法,使用 nugetXamarin.Essentials并在执行 GET 之前检查是否有可用的互联网:

var current = Connectivity.NetworkAccess;

if (current == NetworkAccess.Internet)
{
    // Connection to internet is available
}

推荐阅读