如何取消ServiceStack异步请求?

Coc*_*lla 3 c# http task-parallel-library async-await servicestack

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

var client = new JsonServiceClient(url);
Task reqTask = client.GetAsync(request);
Run Code Online (Sandbox Code Playgroud)

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

如何取消请求,使其立即中止Web请求?

Pan*_*vos 5

短版,似乎CancelAsync确实不执行任何操作。

查看代码,似乎ServiceStack使用了旧方法(v3)异步执行请求并通过回调通知您,这些回调均基于WebRequest和APM样式调用(BeginXXX,EndXXX)构建。的GetAsyncSendAsync方法实际上是使用TaskCompletionSource包装提供了实际的异步操作基于任务的界面。

CancelAsync实际上调用JsonServiceClient层次结构中的类未设置的CancelAsyncFn委托,因此调用它实际上没有任何作用。我怀疑提供了用于创建自定义客户端和操作的信息。

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

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

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

因此,如果cancel意味着放弃请求,则可以通过简单地忽略返回值来实现。如果这意味着stop server processing,则不能。