c# - 如何取消ServiceStack异步请求?

标签 c# http servicestack task-parallel-library async-await

我正在使用 ServiceStack v4,并发出如下异步请求:

var client = new JsonServiceClient(url);
Task reqTask = client.GetAsync(request);

我将同时向不同的服务器发出大量请求,并且需要支持取消以立即取消所有未完成的调用。底层AsyncServiceClient有一个方法 CancelAsync,但它似乎什么也没做。

我怎样才能取消请求,使其立即中止 Web 请求?

最佳答案

简短的版本,似乎 CancelAsync 确实什么也没做。

看代码,似乎ServiceStack使用了异步执行请求的旧方式(v3)和notifying you with with callbacks ,全部构建在 WebRequest 和 APM 样式调用(BeginXXX,EndXXX)之上。 GetAsyncSendAsync 方法实际上是 wrappers that use a TaskCompletionSource在实际的异步操作上提供基于任务的接口(interface)。

CancelAsync 实际上调用了一个 CancelAsyncFn委托(delegate)不是由 JsonServiceClient 的层次结构中的类设置的,因此调用它实际上什么都不做。我怀疑这是为了创建自定义客户端和操作而提供的。

无论如何,取消 HTTP 请求并不像听起来那么容易。您需要了解您要取消的是什么。

  1. 一旦服务器离开您的应用程序,您实际上就无法取消对服务器的调用。
  2. 您不能告诉服务器或干预设备停止处理,因为 HTTP 不提供这种机制。服务器必须提供这样的API,这实际上是一个新的HTTP调用。
  3. 你不能阻止服务器发送响应
  4. 可以取消向服务器发送整个请求。这仅适用于需要可检测时间来序列化的请求
  5. 可以忽略服务器的响应并拒绝打开流来读取正文
  6. 可以停止读取来自服务器的响应
  7. 可以简单地忽略操作的结果

查看代码,似乎您不能执行#4、#5 或#6,因为 AsyncServiceClient 不公开内部使用的 IAsyncResult。您唯一能做的就是简单地忽略响应并付出反序列化的代价。请注意,如果您使用 HttpClient 的 GetStringAsync 方法而不是执行每个单独的步骤,这同样适用。

因此,如果cancel 表示放弃请求,您可以通过简单地忽略返回值来实现。如果它意味着 停止服务器处理,则不能。

关于c# - 如何取消ServiceStack异步请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22430579/

相关文章:

C# WinForms - 任何人都知道 C# GDI 库而不是 SLOW GDI+

node.js - 如何在 NodeJS 中刷新任意大小的 block

php - 在 PHP 文件之间传递数据

c# - ServiceStack JSON 在 dotnet 核心上序列化为小写?

c# - 将 ServiceStack 自动查询与未实现 IConvertible 的值类型一起使用

c# - ListView 处于虚拟模式时无法访问所选项目集合?

c# - 天蓝色表存储不添加新字段

swift - 与 Vapor 客户端作斗争

servicestack - 在 Winforms 离线客户端中重用 ServiceStack 验证

c# - .NET 词典具有相同的键和值,但不是 "equal"