AsyncServiceBase已被弃用,因为ExecuteAsync现在位于 ServiceBase 中,当向/asynconeway/XXX预定义端点发出请求时,它会被调用。
建议的方法不是覆盖ExecuteAsync ,而是实现IMessageFactory,如果IMessageFactory
已在 AppHost IOC 中注册,则会调用它。如果一个 IMessageFactory 没有被注册,它只是被执行 Sync - 此时如果你仍然希望它是非阻塞的,你会覆盖它。ExecuteAsync 的 impl 位于:
// Persists the request into the registered message queue if configured,
// otherwise calls Execute() to handle the request immediately.
//
// IAsyncService.ExecuteAsync() will be used instead of IService.Execute() for
// EndpointAttributes.AsyncOneWay requests
public virtual object ExecuteAsync(TRequest request)
{
if (MessageFactory == null)
{
return Execute(request);
}
BeforeEachRequest(request);
//Capture and persist this async request on this Services 'In Queue'
//for execution after this request has been completed
using (var producer = MessageFactory.CreateMessageProducer()) {
producer.Publish(request);
}
return ServiceUtils.CreateResponseDto(request);
}
IMessageFactory(客户端)/IMessageService(服务器)是 ServiceStack 的消息传递 API 的一部分,它允许您发布消息以供以后延迟执行。有关使用内置 Redis IMessageService 的端到端解决方案的示例,请参阅Redis 和消息 wiki 。也有InMemory和RCon IMesssageService 可用,创建自己的也应该很容易。
未来的异步支持
还有一个运行 ServiceStack的异步分支IHttpAsyncHandler
,并且已经有一个功能性的 alpha 版本可供您试用:ServiceStack-v4.00-alpha.zip
通过此更改,ServiceStack 支持Task<>
作为服务的返回类型。您只需要注册Task<> 插件。要查看完整示例,请查看此集成测试。