我正在开发Windows Phone 8.1项目。 Windows 8.1中有两个版本的http客户端 - system.net.http
和windows.web.http
。 Microsoft建议使用更高版本。
所以,我决定坚持下去。但我无法找到取消以windows.web.http.httpclient
开头的网络请求的方法。在system.net.http.httpclient
中有一个CancelPendingRequests
方法,但后一个选项不存在类似的方法。
那么,是否有可能取消网络请求,如果是这样的话?
示例代码:
考虑如下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正常完成并显示正确的结果。
答案 0 :(得分:8)
Haven尚未对其进行测试,但这可行:
await client.GetStringAsync(new Uri("http://www.google.com")).AsTask(cancellationToken);
如果您不需要取消令牌,您也可以直接取消IAsyncOperation:
var operation = _httpClient.GetStringAsync(new Uri("http://www.google.com"));
var response = await operation;
operation.Cancel();
这个blog post是对整个Task vs IAsyncOperation主题的一个很好的解读。