在连接丢失时取消 HttpClient 请求
Cancel HttpClient request on connection lost
我有以下方法,在 windows-store 项目上上传文件
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
然后我用那个方法检查连接变化。
我想知道的是当我检测到网络变化(从有互联网到没有互联网)时如何停止上传任务。
您可以使用取消标记。你需要 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
,您可能(或可能不想)以某种方式处理它。
我有以下方法,在 windows-store 项目上上传文件
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
然后我用那个方法检查连接变化。
我想知道的是当我检测到网络变化(从有互联网到没有互联网)时如何停止上传任务。
您可以使用取消标记。你需要 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
,您可能(或可能不想)以某种方式处理它。