Ste*_*ert 6 c# ajax comet long-polling asp.net-web-api2
我有一个使用Ajax Comet长轮询的C#ASP.Net(非MVC)项目.网页对由实现IHttpAsyncHandler的类处理的端点进行HTTP调用.
如果没有任何内容(在n秒内)报告给网页,则会发送空的HTTP响应,并重新调用网页.如果有要发送的内容,则发送更新,并且网页会处理并重新呼叫.这是非常标准的推送技术,效果很好.
现在我正在尝试使用WebAPI2,非MVC添加API端点.我有基于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;
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,Web API 方法被声明为,async
并且在其主体中await
使用运算符将线程返回到池中。
我假设为了实现 Comet,您需要使用某种事件。据我记得很多年前我曾经ManualResetEvent
这样做过。然而,它可以是其他任何东西。
重要的是该WaitForEvent
方法应该返回可等待的内容。换句话说,ManualResetEvent
或者其他等待句柄应该包装在任务中。您可以使用AsyncFactory.FromWaitHandle方法来做到这一点。
在 Web API 上下文中有关 asyn/await 的讨论也值得阅读。
归档时间: |
|
查看次数: |
450 次 |
最近记录: |