提问人:Sotem 提问时间:10/10/2023 更新时间:10/10/2023 访问量:49
为什么我的 webapi 请求在浏览器刷新后仍处于挂起状态
Why do my webapi request remain in a pending state after a browser refresh
问:
我遇到了一个非常奇怪的问题,我在网上找不到任何关于这个问题的信息。 在我编写的代码中,我对数据库有一个请求,这需要很长时间。 就像下面的半伪代码一样。
我调用的方法是 .NET Framework WebAPI 控制器的操作。 我正在使用 .NET Framework 版本 4.7.2
static bool _isRefreshing = false;
[HttpGet, Route("endpoint")]
void EndpointContainingLongRunningMethod(){
if (_isRefreshing) return ...msg...;
_isRefreshing = true;
...
var task = new Task<resulttype>(()=>{
using (var scon = new SqlConnection(connectionString))
using (var scom = new SqlCommand()) {
scom.Connection = scon;
scom.CommandText = "HEAVY QUERY";
using (var reader = scom.ExecuteReader()) {
while(reader.Read()) {
...
}
}
}
});
_isRefreshing = false;
return ...;
}
我从客户那里采取的步骤如下:
- 我从客户端调用终结点
- 随后的每次通话都会给我回一条消息,说如果请求尚未完成,请求仍在处理中。
- 我刷新了浏览器,而浏览器仍在后台处理请求。
- 现在,当我尝试调用端点时,无论我在控制器上调用什么方法,所有请求都保持挂起状态,直到给定的时间(这可能是一个简单的内部超时,或者直到作业完全处理,我不确定这一点)。
现在,鉴于上述步骤,我真的很困惑,问题仅在我刷新浏览器后才会发生。 问题仅由于 SqlReader 而发生。 我可以确认任务在不同的线程上运行,例如,任务中的 HttpContext.Current 为空。
我尝试过的事情:
- 将 sqlreader 替换为 Thread.Sleep(60000)(当我这样做时,即使在浏览器刷新后,一切都可以在不进入挂起状态的情况下工作)。
- 我试图不运行异步请求,而只是提供了一个单独的端点,该端点首先检查数据是否已完成处理。
- 我尝试将请求放在非 webapi 类中,以查看我是否由于使用会话状态而遇到会话锁定。
- 将 IIS 应用程序池设置“最大工作进程数”设置为 0。
- 我尝试在连接字符串中将连接池设置为 false 和 true
我通过谷歌搜索了很多,在堆栈溢出中,我完全感到困惑。
我的问题是,是什么原因导致一切 100% 正常工作,但浏览器刷新使所有后续请求都处于待处理状态而不是被处理(我设置了一个断点,在这种情况下,待处理状态是由于端点在“待处理超时”结束之前根本没有被击中)?
答: 暂无答案
评论
if-else
HttpApplication