在连接丢失时取消HttpClient请求

时间:2016-05-31 08:15:53

标签: c# windows-runtime httpclient

我在Windows商店项目中有以下方法来上传文件

public async Task<Boolean> UploadFileStreamService(Stream binaries, String fileName, String filePath)
    {

        try
        {
            filePath = Uri.EscapeDataString(filePath);

            using (var httpClient = new HttpClient { BaseAddress = Constants.baseAddress })
            {

                var content = new StreamContent(binaries);
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", App.Current.Resources["token"] as string);
                App.Current.Resources["TaskUpload"] = true;
                using (var response = await httpClient.PostAsync("file?fileName=" + filePath, content))
                {

                    string responseData = await response.Content.ReadAsStringAsync();
                    if (responseData.Contains("errorCode"))
                        throw new Exception("Exception: " + responseData);

                    else
                    {
                        JsonObject jObj = new JsonObject();
                        JsonObject.TryParse(responseData, out jObj);
                        if (jObj.ContainsKey("fileId"))
                        {
                            if (jObj["fileId"].ValueType != JsonValueType.Null)
                            {
                                App.Current.Resources["NewVersionDoc"] = jObj["fileId"].GetString();
                            }
                        }

                    }
                    return true;
                }
            }
        }
        catch (Exception e)
        {
            ...
        }
    }

在app.xaml.cs上我有构造函数:

NetworkInformation.NetworkStatusChanged +=
        NetworkInformation_NetworkStatusChanged; // Listen to connectivity changes

在该方法中,我检查连接更改。

我想知道的是当我检测到网络变化时(从拥有互联网到没有互联网),如何停止上传任务。

1 个答案:

答案 0 :(得分:1)

您可以使用取消令牌。您需要CancellationTokenSource

private readonly CancellationTokenSource _cts = new CancellationTokenSource();

然后将令牌传递给您的UploadFileStreamService方法(使用_cts.Token获取令牌):

public async Task<Boolean> UploadFileStreamService(Stream binaries, String fileName, String filePath, CancellationToken ct)

并使用另一个接受令牌的PostAsync重载(注意 - 在可能的情况下也使用接受所有其他异步方法的令牌的重载,例如ReadAsStringAsync):

using (var response = await httpClient.PostAsync("file?fileName=" + filePath, content, ct))

然后当您发现网络连接丢失时,请取消:

_cts.Cancel();

请注意,这会在PostAsync调用上抛出OperationCancelledException,您可能(或可能不想)以某种方式处理它。