c# - 如何通过 WebAPI2 执行 C# Ajax Comet?

标签 c# ajax asp.net-web-api2 comet long-polling

我有一个使用 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/

相关文章:

c# - 为什么使用 .AsEnumerable() 而不是强制转换为 IEnumerable<T>?

c# - C# 是否按值传递给 Lambda?

javascript - Ajax 帖子未返回响应

cors - Access-Control-Allow-Origin - 多个域访问 MVC web api 2

c# - REST API 设计 - 使用请求主体删除多个项目

C# 后台 worker UI 更新

c# - 如何在 C# 中处理/杀死锁定的线程

java - Wicket 面板中的 Ajax 不起作用

javascript - 使用 <a> 标签加载 Ajax 页面

asp.net-web-api2 - 将未经授权的请求重定向到 Azure AD 进行登录