我有一个使用 Ajax Comet 长轮询的 C# ASP.Net(非 MVC)项目。网页对由实现 IHttpAsyncHandler 的类处理的端点进行 HTTP 调用。
如果(n秒内)没有什么可以向网页报告,则发送一个空的HTTP响应,网页重新调用。如果有东西要发送,则发送更新,网页处理并重新调用。这是非常标准的推送技术,而且效果很好。
现在我正在尝试使用 WebAPI2、非 MVC 添加 API 端点。我有基于 ApiController 类的同步 Controller 。
我想为 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 做到这一点方法。
这篇discussion也值得一读关于 Web API 上下文中的 asyn/await。
关于c# - 如何通过 WebAPI2 执行 C# Ajax Comet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41016441/