使用ServiceStack的AsyncServiceBase解决问题

rus*_*der 8 servicestack

我有以下服务

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

它被不同的消费者跟随

POST
http://srv1/app/json/asynconeway/EvaluateStock
Run Code Online (Sandbox Code Playgroud)

使用asynconeway我假设它将允许我实现火灾并忘记WCF与IsOneWay一起使用.但似乎并非如此.

我错过了什么吗?

myt*_*thz 8

AsyncServiceBase已被弃用,因为ExecuteAsync现在位于ServiceBase中,这是在向/ asynconeway/XXX预定义端点发出请求时调用的内容.

而不是重写ExecuteAsync,推荐的方法是实现IMessageFactory,如果IMessageFactory已经在AppHost IOC中注册了该IMessageFactory.如果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);
}
Run Code Online (Sandbox Code Playgroud)

IMessageFactory(客户端)/ IMessageService(服务器)是ServiceStack的Messaging API的一部分,它允许您稍后发布延迟执行的消息.有关使用内置Redis IMessageService的端到端解决方案的示例,请参阅Redis和Messaging wiki.还有InMemoryRCon IMesssageService可用,也应该很容易创建自己的.

未来的异步支持

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

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