我们在Win 2012 R2上的IIS 8.5上运行一个Owin应用程序,位于负载均衡器后面。一些网页,对某些网址的请求无限期挂起。如果用户在浏览器中选择取消,并重新加载页面,则一切正常,服务器响应迅速。
在IIS管理器中,我们可以看到请求挂起: 悬挂似乎发生在Owin管道内。我们正在运行.NET 4.5.2和最新的Owin软件包。
以下是/api/whoami
端点的代码:
[Authorize]
public class WhoAmIController : ApiController
{
[Route("whoami")]
[HttpGet]
public IHttpActionResult Whoami()
{
return Json(ClaimsPrincipal.Current.Identity.Name);
}
}
观察到对此端点的请求在IIS管道中的AuthenticateRequest
阶段挂起,而不是PreExecuteRequestHandler
,这是OWIN管道的默认IIS阶段。我们唯一的身份验证方法是cookie身份验证,它在AuthenticateRequest
阶段执行。
有什么想法吗?
编辑:调整屏幕截图
答案 0 :(得分:1)
问题是我们在IIS事件PreSendRequestHeaders
上执行了代码,根据这种情况,这显然很糟糕
http://www.asp.net/aspnet/overview/web-development-best-practices/what-not-to-do-in-aspnet,-and-what-to-do-instead#presend
我们的目的是在所有请求的出路上调整HTTP标头。修复是将代码移动到BeginRequest
事件。
答案 1 :(得分:-1)
您是否尝试将.ConfigureAwait(false)
添加到异步调用中?
这样做会使“正确”线程继续继续。