【发布时间】:2015-10-21 10:05:05
【问题描述】:
我们在负载均衡器后面的 Win 2012 R2 上运行 IIS 8.5 上的 Owin 应用程序。在某些情况下,对某些 URL 的请求会无限期挂起。如果用户在浏览器中选择取消,然后重新加载页面,一切正常,服务器响应很快。
在 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 阶段执行。
有什么想法吗?
编辑:调整截图
【问题讨论】:
-
你在使用异步等待吗?
-
@TomasJansson 是的,我们在应用程序中使用异步等待。我不确定它是否用于处理相关的特定端点。该应用程序部分是自定义代码,部分是 IdentityServer3。
-
好的,那么您可能对同步上下文有问题。执行 await 时,如果您没有指定,则不能保证返回“正确”线程。去年 NNUG 的这个演讲详细介绍了:vimeo.com/108094560
-
关于Synchronization context的部分从26:30左右开始,基本上你需要做的大概就是加上ConfigureAwait(false)。这导致等待后的继续将在线程池线程上继续。