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

标签 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方法,但对于后一个选项不存在类似的方法。

那么,是否可以取消 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/

相关文章:

c# - 输入语言 Hook

c# - Entity Framework 和关系

networking - 我怎样才能从子网掩码计算IP地址范围

c++ - QT QTcpServer 没有及时连接

c# - 如果 C# 句子中存在该单词,如何屏蔽句子中的特定单词

c# - MSTest 中数据驱动测试的问题

c# - 使用 int NetworkStream.Read(Span<Bytes>) 接收完整的网络流

c# - 使用事件等待句柄阻止窗口关闭,然后包装为异步等待。可以接受吗?

javascript - 调试Windows应用商店应用-错误消息始终显示相同的行号

c# - 将 cookie 设置为 WebView 控件