我正在使用ServiceStack v4,并发出如下的异步请求:
var client = new JsonServiceClient(url);
Task reqTask = client.GetAsync(request);
我会同时向不同的服务器发出大量请求,并且需要支持取消以立即取消所有未完成的呼叫。基础AsyncServiceClient
有一个方法CancelAsync
,但它似乎没有做任何事情。
如何取消请求以便立即中止网络请求?
答案 0 :(得分:5)
简短版本,似乎CancelAsync确实没有做任何事情。
查看代码,似乎ServiceStack使用异步执行请求和notifying you with with callbacks的旧方法(v3),所有这些都构建在WebRequest和APM样式调用(BeginXXX,EndXXX)之上。
GetAsync
,SendAsync
方法实际上是wrappers that use a TaskCompletionSource,以便在实际的异步操作中提供基于任务的接口。
CancelAsync实际上调用的是CancelAsyncFn委托,它不是由JsonServiceClient的层次结构中的类设置的,所以调用它实际上什么都不做。我怀疑这是为了创建自定义客户端和操作。
在任何情况下,取消HTTP请求并不像听起来那么容易。您需要了解您尝试取消的内容。
查看代码,您似乎无法执行#4,#5或#6,因为AsyncServiceClient不会公开内部使用的IAsyncResult。您唯一能做的就是忽略响应并支付反序列化的代价。请注意,如果您使用HttpClient的GetStringAsync方法而不是执行每个单独的步骤,则同样适用。
因此,如果cancel
表示放弃请求,则可以通过忽略返回值来实现。如果这意味着stop server processing
,那么您就无法做到。
答案 1 :(得分:1)
可取消请求是一项功能。
http://www.github.com/ServiceStack/ServiceStack/wiki/Cancellable-Requests
您基本上标记了您的请求,并且该功能会使用标记添加要取消的服务调用。您还必须在服务中包装逻辑以处理此功能,就像缓存功能一样。