Windows 8.1中的取消HTTP客户端请求

6
我正在开发一个Windows Phone 8.1项目。在Windows 8.1中有两个版本的http client - system.net.httpwindows.web.http。Microsoft建议使用后者。
因此,我决定采用它。但是我找不到一种方法来取消使用windows.web.http.httpclient启动的网络请求。在system.net.http.httpclient中,存在一个CancelPendingRequests方法,但后者选项没有类似的方法。
那么,是否可以取消网络请求,如果可以,怎么做?
示例代码:
考虑以下以Google为目标的Http Get请求。 如果用户希望,在其完成之前我想要取消它。
// 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。

另外,我尝试在请求正在进行时(例如GetStringAsync)对HttpClient调用Dispose()。 但是,仍然没有抛出任何异常,也没有取消该请求;GetStringAsync将正常完成并显示正确的结果。

1个回答

8
我还没有测试过,但是这可能会起作用:
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();

这篇博客文章是关于Task和IAsyncOperation的细致阐述,值得一读。


2
是的,这个可行。实际上今天我也看了MSDN上托管的示例,它使用了相同的方法。参考:http://code.msdn.microsoft.com/wpapps/HttpClient-sample-55700664 - Shivangi Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接