如何取消ServiceStack异步请求?

时间:2014-03-15 22:30:01

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

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

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

我会同时向不同的服务器发出大量请求,并且需要支持取消以立即取消所有未完成的呼叫。基础AsyncServiceClient有一个方法CancelAsync,但它似乎没有做任何事情。

如何取消请求以便立即中止网络请求?

2 个答案:

答案 0 :(得分:5)

简短版本,似乎CancelAsync确实没有做任何事情。

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

CancelAsync实际上调用的是CancelAsyncFn委托,它不是由JsonServiceClient的层次结构中的类设置的,所以调用它实际上什么都不做。我怀疑这是为了创建自定义客户端和操作。

在任何情况下,取消HTTP请求并不像听起来那么容易。您需要了解您尝试取消的内容。

  1. 一旦它离开你的应用程序,你就无法取消对服务器的调用。
  2. 您不能告诉服务器或中间设备停止处理,因为HTTP没有提供这样的机制。服务器必须提供这样的API,实际上是一个新的HTTP调用。
  3. 您无法阻止服务器发送回复
  4. 可以取消将整个请求发送到服务器。这仅适用于需要花费大量时间来序列化的请求
  5. 可以忽略服务器的响应并拒绝打开流来阅读正文
  6. 可以停止阅读服务器的响应
  7. 可以简单地忽略操作的结果
  8. 查看代码,您似乎无法执行#4,#5或#6,因为AsyncServiceClient不会公开内部使用的IAsyncResult。您唯一能做的就是忽略响应并支付反序列化的代价。请注意,如果您使用HttpClient的GetStringAsync方法而不是执行每个单独的步骤,则同样适用。

    因此,如果cancel表示放弃请求,则可以通过忽略返回值来实现。如果这意味着stop server processing,那么您就无法做到。

答案 1 :(得分:1)

可取消请求是一项功能。

http://www.github.com/ServiceStack/ServiceStack/wiki/Cancellable-Requests

您基本上标记了您的请求,并且该功能会使用标记添加要取消的服务调用。您还必须在服务中包装逻辑以处理此功能,就像缓存功能一样。