gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:53:05 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com