gpt4 book ai didi

c# - ASP.NET Core MVC 应用程序请求永远不会完成

转载 作者:太空狗 更新时间:2023-10-30 01:15:14 26 4
gpt4 key购买 nike

我正在尝试在单核 Windows Server 2012 主机上托管 ASP.NET Core MVC 项目。我正在使用 ASP.NET Core MVC 1.0.0 并在 IIS 8 上运行 .NET Framework 4.6.1 该应用程序在最初约 10 分钟内运行良好,然后服务器突然停止响应。

起初我以为是数据库端的死锁,所以我在 DbContext 类中添加了日志记录:

private static long ActiveContextCount = 0;
private ILogger _log;
private Stopwatch _timer = new Stopwatch();
private Guid _contextId = Guid.NewGuid();
public BlogContext(string nameOrConnectionString, ILoggerFactory logger)
:base(nameOrConnectionString)
{
_log = logger.CreateLogger<BlogContext>();
Database.Log = l =>
{
_log.LogInformation(l);
};
ActiveContextCount++;
_timer.Start();
_log.LogInformation("BlogContext created. GUID:{0}, Active count {1}", _contextId, ActiveContextCount);
}

protected override void Dispose(bool disposing)
{
ActiveContextCount--;
_timer.Stop();
_log?.LogInformation("BlogContext Disposed. GUID:{0}, Live time: {1}ms, Active count {2}", _contextId, _timer.ElapsedMilliseconds, ActiveContextCount);
base.Dispose(disposing);
}

我正在使用 Entity Framework 6 并且我已经将 DbContext 设置为范围:

services.AddScoped(p => new BlogContext(_dataDbConnectionString, p.GetRequiredService<ILoggerFactory>()));

事实证明,数据库操作一切正常。我在日志中跟踪请求并注意到某些请求的最后日志为:

[Information] Executing ViewResult, running view at path "/Views/Blog/Details.cshtml".

并且永不完成(即无法在日志中找到处置)。从那时起,ActiveContextCount 就堆积到几百,整个应用程序挂起并停止响应。

(EDIT 08/29) 另一个例子,甚至没有执行任何查询:

[Information] Request starting HTTP/1.1 GET http://myapp/  
[Information] UsersContext created. GUID:bb7743b9-7999-4a01-819f-3d239d34d4d9, Active count 7
[Information] HttpContext.User merged via AutomaticAuthentication from authenticationScheme: "Identity.Application".
[Information] BlogContext created. GUID:8c7505d4-5c87-428e-ad56-12f35f54aadc, Active count 6
[Information] Executing action method "MyApp.Controllers.HomeController.Index (MyApp)" with arguments (["1"]) - ModelState is Valid
[Information] Executing ViewResult, running view at path "/Views/Home/Index.cshtml".

我卡在这一步了。为什么 View 结果永远不会完成?这是框架或我的应用程序中的错误吗?即使有错误,为什么请求不会在超时后中止并放弃?我试图在 web.config 中指定超时但没有帮助:

<aspNetCore processPath=".\MyApp.exe" arguments="" forwardWindowsAuthToken="false" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" requestTimeout="00:00:40" />

如何进一步调试这个问题?

最佳答案

经过几周的调试,我终于找到了问题所在。问题确实在 View 中。我浏览了 asp.net core doc并注意到这一行:

The PartialAsync method is available for partial views containing asynchronous code (although code in views is generally discouraged).

然后我就去看了githubHtml.Partial的实际实现.

var result = htmlHelper.RenderPartialAsync(partialViewName, htmlHelper.ViewData.Model, viewData);
result.GetAwaiter().GetResult();

所以同步部分实际上只是异步版本的阻塞包装器!这是经典的异步等待死锁 (1),因为我在局部 View 中调用 @await Component.InvokeAysnc(因为没有用于调用 View 组件的同步版本)。我已将所有 Html.Partial 引用替换为 await Html.PartialAsync 并解决了问题。我真的希望他们能对此有更好的警告...... :(

附言我没有发布超过 2 个链接的声誉,但为什么...

(1):blog.stephencleary.com/2012/07/dont-block-on-async-code.html

关于c# - ASP.NET Core MVC 应用程序请求永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39195134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com