8

我有以下服务

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 一样实现火而忘记。但似乎并非如此。

我错过了什么吗?

4

1 回答 1

8

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 。也有InMemoryRCon IMesssageService 可用,创建自己的也应该很容易。

未来的异步支持

还有一个运行 ServiceStack的异步分支IHttpAsyncHandler,并且已经有一个功能性的 alpha 版本可供您试用:ServiceStack-v4.00-alpha.zip

通过此更改,ServiceStack 支持Task<>作为服务的返回类型。您只需要注册Task<> 插件。要查看完整示例,请查看此集成测试

于 2012-06-20T18:42:00.520 回答