【问题标题】:Owin on IIS web requests hang indefinitelyIIS Web 请求上的 Owin 无限期挂起
【发布时间】: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)。这导致等待后的继续将在线程池线程上继续。

标签: asp.net iis owin iis-8.5


【解决方案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 事件。

【讨论】:

    【解决方案2】:

    您是否尝试将.ConfigureAwait(false) 添加到您的异步调用中?

    这样做将使继续在“正确”线程上继续。

    【讨论】:

    • 感谢您的意见。如果有异步/等待,它在库代码中,而不是我们可以得到的东西。我将使用代码示例更新问题。
    • @VidarKongsli 我认为您可以在调用库代码时配置代码。可能这不是问题,但我之前遇到过这样的问题(比如本周):)
    • 无论如何,感谢您的提示,尽管这并不是问题所在。我们发现了其他一些弱点,仔细检查了代码中与 Task 相关的问题。
    猜你喜欢
    • 2018-09-02
    • 2016-08-09
    • 2014-02-08
    • 1970-01-01
    • 2018-05-19
    • 2013-05-10
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多