我有一个c asp.net(非mvc)项目,它使用ajax comet长轮询。web页面对由实现ihttpasynchandler的类处理的端点进行http调用。
如果没有要向网页报告的内容(在n秒内),则会发送空的http响应,并重新调用网页。如果有要发送的内容,则发送更新,网页将处理并重新调用。这是相当标准的推送技术,而且工作得很好。
现在我试图添加api端点,使用webapi2,非mvc。我让同步控制器工作,基于apicontroller类。
我想为api调用设置推送技术,这样api用户就不必轮询更新。
与上面的方法类似,接收api端点调用,并存储上下文。如果超时过期,则返回空调用,并希望调用方再次调用。如果数据在超时时间内更新,则数据将返回给调用方,然后调用方将再次调用并等待更多更新。
问题是似乎没有异步版本的apicontroller。其目的是释放处理api调用的线程,将其返回到池中,然后当有可用的数据或超时过期时,使用工作线程返回响应。
如何设置apicontroller,以便释放处理调用的线程,存储调用上下文,并在稍后的时间点向调用发送响应?
最佳答案
您可以使用async/await来实现您想要的目标,即:
[HttpPost]
public async Task<HttpResponseMessage> LongRunningOperation([FromBody]Input obj)
{
// Do what ever you need with input data
await WaitForEvent();
// Do what ever you need to return a response
return someResponse;
}
在本例中,web api方法被声明为
async
,在其主体中,使用await
运算符将线程返回到池。我假设为了实现comet,您使用了某种事件。据我多年前的记忆,我是用
ManualResetEvent
来做的。然而,它可以是其他任何东西。重要的是
WaitForEvent
方法应该返回一些可等待的内容。换句话说,任务中应该包含ManualResetEvent
或其他等待句柄。你可以用AsyncFactory.FromWaitHandle方法来做。在web api的上下文中,关于asyn/await的discussion也值得一读。