如何取消ServiceStack异步请求?

可可瓦拉

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

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

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

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

帕纳焦蒂斯·卡纳沃斯

短版,似乎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,则不能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Objective-C中取消异步HTTP请求?

来自分类Dev

取消之前的异步 .load() 请求

来自分类Dev

使用useInterval钩子取消异步请求

来自分类Dev

可取消的异步Web请求

来自分类Dev

如何在可取消请求流中重复使用单个异步 Web 服务调用?

来自分类Dev

如何取消以前的axios请求?

来自分类Dev

如何取消TCL HTTP请求

来自分类Dev

异步GET请求如何工作?

来自分类Dev

如何取消JavaScript中的异步过程?

来自分类Dev

如何在Swift中取消异步功能

来自分类Dev

如何从客户端取消异步任务

来自分类Dev

如何使用标签主机取消异步任务

来自分类Dev

如何使异步池可取消?

来自分类Dev

Angular $ http服务,如何取消/取消订阅未决请求?

来自分类Dev

Angular $ http服务,如何取消/取消订阅未决请求?

来自分类Dev

Kendo DataSource:如何取消更新请求

来自分类Dev

矩形-如何取消/实施我自己的请求

来自分类Dev

如何使用rxjs取消嵌套的请求

来自分类Dev

如何取消HttpClient GET Web请求

来自分类Dev

如何取消Angular Service Ajax请求

来自分类Dev

如何取消[NSURLConnection sendAsynchronousRequest:..]发送的请求

来自分类Dev

如何取消待处理的脚本标签请求?

来自分类Dev

SDWebImage 4 - 如何取消下载请求?

来自分类Dev

发送新请求时,如何取消AJAX请求?

来自分类Dev

Guzzle如何发送异步Web请求?

来自分类Dev

如何在异步中使用请求?

来自分类Dev

如何管理多个异步NSURLConnection请求

来自分类Dev

如何正确处理异步并发请求?

来自分类Dev

如何抽象异步HTTP请求,同步