IIS Web 请求上的 Owin 无限期挂起
Owin on IIS web requests hang indefinitely
我们是 运行 负载均衡器后面的 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
阶段执行。
有什么想法吗?
编辑:调整截图
您是否尝试过将 .ConfigureAwait(false)
添加到您的异步调用中?
这样做将使继续在 "correct" 线程上继续。
问题是我们在 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 headers。解决方法是将代码移至 BeginRequest
事件。
我们是 运行 负载均衡器后面的 Win 2012 R2 上 IIS 8.5 上的 Owin 应用程序。在某些情况下,对某些 URL 的请求会无限期地挂起。如果用户在浏览器中选择取消,然后重新加载页面,一切正常,服务器响应很快。
在 IIS 管理器中,我们可以看到请求挂起:
这是 /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
阶段执行。
有什么想法吗?
编辑:调整截图
您是否尝试过将 .ConfigureAwait(false)
添加到您的异步调用中?
这样做将使继续在 "correct" 线程上继续。
问题是我们在 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 headers。解决方法是将代码移至 BeginRequest
事件。