如何通过WebAPI2进行C#Ajax Comet?

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,以便释放处理调用的线程,存储调用上下文,我可以在以后的某个时间点发送响应?

Mic*_*ski 2

您可以使用 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 的讨论也值得阅读。