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

Rit*_*dia 6 c# networking windows-store-apps windows-8.1 windows-phone-8.1

我正在开发一个Windows Phone 8.1项目.Windows 8.1中有两个版本的http客户端 - system.net.httpwindows.web.http.Microsoft建议使用更高版本.

所以,我决定坚持下去.但我找不到取消开始的网页请求的方法windows.web.http.httpclient.在system.net.http.httpclient有一种CancelPendingRequests方法,但为后来的选项中不存在类似的方法.

那么,是否有可能取消网络请求,如果是这样的话?

示例代码:

考虑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);
    }
 }
Run Code Online (Sandbox Code Playgroud)

HttpClient的所有方法都不支持CancellationToken.

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

Jes*_*sse 8

尚未测试过,但这可行:

await client.GetStringAsync(new Uri("http://www.google.com")).AsTask(cancellationToken);
Run Code Online (Sandbox Code Playgroud)

如果您不需要取消令牌,您也可以直接取消IAsyncOperation,如下所示:

var operation = _httpClient.GetStringAsync(new Uri("http://www.google.com"));
var response = await operation;

operation.Cancel();
Run Code Online (Sandbox Code Playgroud)

这篇博文是对Task vs IAsyncOperation主题的一个很好的解读.

  • 这是有效的.实际上今天我也看了MSDN上托管的样本快速使用相同的方法.参考:HTTP://code.msdn.microsoft.com/wpapps/HttpClient-sample-55700664 (2认同)