我有以下服务
public class AppService : AsyncServiceBase<EvaluateStock>
{
public IBus Bus { get; set; }
public override object ExecuteAsync(EvaluateStock request)
{
// this will block the incoming http request
// unitl task is completed
// long computation
// Bus.Publish(result)
}
}
这被通过以下方式不同消费者称为
POST
http://srv1/app/json/asynconeway/EvaluateStock
使用asynconeway我是假设,它将使我实现发射后不管是WCF与IsOneWay一样。 但似乎并非如此。
难道我错过了什么?
AsyncServiceBase已被弃用ExecuteAsync现在在ServiceBase是当一个请求时到/ asynconeway / XXX预先定义的终点是什么被调用。
而不是覆盖ExecuteAsync推荐的方法是实现IMessageFactory是如果一个东西被调用IMessageFactory
已经在国际奥委会APPHOST被注册。 如果IMessageFactory没有被注册,比它刚刚被执行同步 - 在这一点,如果你仍然想要它无阻塞你会覆盖它。 对于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的和消息维基为使用内置的Redis IMessageService的端至端解决方案的一个例子。 也有InMemory和RCON IMesssageService的可用,它应该很容易创建自己的为好。
未来异步支持
还有一个异步分支有ServiceStack上运行IHttpAsyncHandler
,已经有可用的功能阿尔法建立你在尝试: ServiceStack-v4.00-alpha.zip
随着这一变化ServiceStack支持Task<>
作为服务返回类型。 你只需要注册任务<>插件 。 要查看完整的例子来看一下这个集成测试 。