GetResponseAsync 不接受取消令牌

2024-02-08

看来 GetResponseAsync 不接受 Async/Await 中的cancelToken。所以问题是,如果我需要从响应中收集 Cookie,我该如何取消以下过程:

 using (HttpWebResponse response = (HttpWebResponse) await request.GetResponseAsync())
 {
    cookies.Add(response.Cookies);
 }

也欢迎实现上述目的的替代代码。


像这样的东西应该有效(未经测试):

public static class Extensions
{
    public static async Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request, CancellationToken ct)
    {
        using (ct.Register(() => request.Abort(), useSynchronizationContext: false))
        {
            var response = await request.GetResponseAsync();
            ct.ThrowIfCancellationRequested();
            return (HttpWebResponse)response;
        }
    }
}

理论上,如果要求取消ct and request.Abort被调用,await request.GetResponseAsync()应该抛出一个WebException。不过,在 IMO 中,在使用结果时显式检查取消总是一个好主意,以减轻竞争条件,所以我调用ct.ThrowIfCancellationRequested().

另外,我假设request.Abort是线程安全的(可以从任何线程调用),所以我使用useSynchronizationContext: false(我还没有验证过)。

[更新]解决OP关于如何区分之间的评论WebException因取消或任何其他错误而造成的。这是可以做到的,所以TaskCanceledException(源自OperationCanceledException) 将在取消时正确抛出:

public static class Extensions
{
    public static async Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request, CancellationToken ct)
    {
        using (ct.Register(() => request.Abort(), useSynchronizationContext: false))
        {
            try
            {
                var response = await request.GetResponseAsync();
                return (HttpWebResponse)response;
            }
            catch (WebException ex)
            {
                // WebException is thrown when request.Abort() is called,
                // but there may be many other reasons,
                // propagate the WebException to the caller correctly
                if (ct.IsCancellationRequested)
                {
                    // the WebException will be available as Exception.InnerException
                    throw new OperationCanceledException(ex.Message, ex, ct);
                }

                // cancellation hasn't been requested, rethrow the original WebException
                throw;
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GetResponseAsync 不接受取消令牌 的相关文章

随机推荐

  • 创建新的 Hibernate 表

    所以我对 Hibernate 还很陌生 而且我正在开发一个大型应用程序 该应用程序已经有一个包含多个 Hibernate 表的数据库 我正在开发一项新功能 其中包括一个新功能 Entity类 我需要将这些对象存储在一个新表中 该类声明如下
  • 如何在Jenkins中使用ANSIcolor插件?

    我已经为 Jenkins 安装了 ANSI color 插件 在作业中 我已使用默认配置文件 xterm 激活了该插件 我不知道打印到控制台日志时如何对控制台日志的输出进行着色 来自批处理文件的日志 Windows 平台 有关的文档 htt
  • 作为 OpenShift 用户,我可以做什么?

    我目前正在使用虚拟服务器并想尝试一下开放式班次 http openshift redhat com 出去 但我还没有真正了解它是如何工作的 我可以获得我的 网络空间 的 root 访问权限吗 我可以设置服务器操作系统 例如 Debian 7
  • 当从 Java 查询时,Sql Server 会忽略 varchar 列上的索引并进行表扫描

    问题 我有一个 SQL Server 表 其中有一个 varchar 列和数百万行 它已建立索引 从 SQL Server 查询工具中运行查询速度很快 因为它使用索引 当我从 Java JDBCPreparedStatement 运行查询时
  • Django 验证单元测试

    我试图模拟 django contrib auth 验证方法的返回值 该方法在视图的登录方法中调用 有view py代码 def login request if request method POST username get usern
  • 如何更改 Mac OS X 启动板中显示的 Java 应用程序名称

    当我的申请写成Java with SWT运行在OS X 都从下Eclipse和来自jar 它在启动板中的名称为 java 如图所示 在我的代码的开头我调用Display setAppName MyApp 并且菜单栏和菜单项中的应用程序名称是
  • PhoneGap 3.1.0 没有节点/npm 和命令行工具

    是否可以在没有节点包的情况下下载和使用 PhoneGap 3 1 0 由于网络连接受到限制 从 git hub 命令行安装节点 PhoneGap 模块 Cordova 模块和插件很烦人 使用 PhoneGap 2 9 似乎是那么容易和简单
  • 错误:无法构建 gem 本机扩展

    gem install unf ext v 0 0 6 localhost workflow boyun ryan007 gem install unf ext v 0 0 6 Building native extensions This
  • AVMutableComposition 输出冻结在第一个视频的最后一帧

    我正在尝试使用 AVMutableCompositions 将多个剪辑 视频 合并为一个 我已经成功完成了这一操作以及旋转和翻译每条指令 但是 仍然存在一个问题 当第一个剪辑完成时 输出冻结在最后一帧 第一个剪辑的最后一帧 仅当有另一个剪辑
  • 使用 VBA 声明相对于活动单元格的范围

    我需要声明一个相对于活动单元格的范围对象 问题是 每次宏运行时我想要选择的行数和列数都不同 例如 我有两个变量 numRows and numCols 我想选择一个范围 其左上角有 ActiveCell 单元格的行为 ActiveCell
  • 使用 Linq to SQL 进行多线程处理

    由于原始线程 使用 Linq to SQL 进行多线程处理 https stackoverflow com questions 1815537 现在已经很老了 我想我应该就类似的主题发布另一个问题 考虑一个场景 其中 DomainServi
  • Swift:数组内的字典

    Data firstName Foo lastName Bar firstName John lastName Doe 如何使用 swift 数组和字典拥有这种结构 该数据显示数组内的字典 对吧 所以我建议 var persons Arra
  • 从终端中的 url 运行 python 脚本

    我想知道有什么方法可以从终端中的 url www blahblah com script py 执行 python 脚本而不将文件下载到磁盘吗 Thanks 您希望它在客户端上运行 还是在服务器上运行 将返回结果 如果您想在客户端上运行它
  • 使用 REST Api Visual Studio Team Services 更新文件

    有没有办法使用 HTTP 动词更新 Visual Studio 团队服务帐户上项目中的文件内容 类似于在 github 上完成的操作https developer github com v3 repos contents update a
  • 将“最大长度”添加到正则表达式

    如何使用一个属性来扩展已经存在的正则表达式 该属性告诉正则表达式不能超过最大长度 比方说 255 我有以下正则表达式 a zA Z0 9 0 9 1 3 0 9 1 3 0 9 1 3 a zA Z0 9 a zA Z 2 4 0 9 1
  • 导入 Python 模块失败 (http.cookies)

    从我在这里和其他地方的研究中了解到 似乎如果a 模块位于Python搜索路径中或b 包含在Python搜索路径中的包中 则导入命令应该能够查找并导入模块 在下面的交互式脚本中 请注意这两个条件都已满足 http 文件夹包含一个 init p
  • 设置 Linq to NHibernate ADO 命令超时

    如何增加 NHibernate Linq To Sql 中的超时 不是连接超时 而是 ado 命令超时 using ISession session NHibernateHelper OpenSession NHibernateHelper
  • self.window 始终为零

    我目前正在尝试使用窗口控制器显示一个窗口 这就是我所拥有的 NSWindow 子类 import Cocoa import CoreLocation class TweetWindow NSWindow var locationManage
  • 尝试自我更新作曲家时出错

    当我尝试自我更新作曲家时 我收到 权限被拒绝 错误消息 但是当我尝试使用 sudo 执行相同的命令时 我收到错误消息 找不到命令 请帮我 在带有 sudo 的终端中 我输入了composer phar的完整路径 它对我有用 sudo usr
  • GetResponseAsync 不接受取消令牌

    看来 GetResponseAsync 不接受 Async Await 中的cancelToken 所以问题是 如果我需要从响应中收集 Cookie 我该如何取消以下过程 using HttpWebResponse response Htt