我正在处理一个 Windows Phone 8.1 项目。 Windows 8.1 中有两个版本的http 客户端——system.net.http
和windows.web.http
。 Microsoft 建议使用后者。
所以,我决定接受它。但是我找不到取消以 windows.web.http.httpclient
开始的网络请求的方法。在 system.net.http.httpclient
中有一个 CancelPendingRequests
方法,但对于后一个选项不存在类似的方法。
那么,是否可以取消 Web 请求?如果可以,如何取消?
示例代码:
考虑一个 Http Get
请求 google,如下所示。
如果用户愿意,我想在完成之前取消它。
// Windows Phone 8.1 project (not silverlight)
public sealed partial class MainPage : Page
{
Windows.Web.Http.HttpClient client = new Windows.Web.Http.HttpClient();
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
Windows.Phone.UI.Input.HardwareButtons.BackPressed += (s, e) =>
{
CancelGet();
}
}
private void CancelGet()
{
// What to put here??
// tried client.Dispose();
// but still get request completes successfully
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
string res = await client.GetStringAsync(new Uri("http://www.google.com", UriKind.Absolute));
System.Diagnostics.Debug.WriteLine("result obtained\n" + res);
}
}
HttpClient 的所有方法都不支持 CancellationToken。
我还尝试在请求正在进行时调用 HttpClient 上的 Dispose()(比如 GetStringAsync)。但是仍然没有抛出任何异常,也没有取消请求; GetStringAsync 正常完成并显示正确的结果。
最佳答案
还没有测试过,但这可以工作:
await client.GetStringAsync(new Uri("http://www.google.com")).AsTask(cancellationToken);
如果不需要取消 token ,也可以像这样直接取消IAsyncOperation:
var operation = _httpClient.GetStringAsync(new Uri("http://www.google.com"));
var response = await operation;
operation.Cancel();
这blog post是关于整个 Task vs IAsyncOperation 主题的好读物。
关于c# - Windows 8.1中的http客户端取消请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23457797/