为什么这个 ASP.NET MVC 控制器会挂起 IIS 中的 AppPool?

问题描述 投票:0回答:1

这是使用 C# ASP.NET MVC 5 和 Entity Framework 6、.NET 4.8、MySql、IIS 编写的。

我似乎在这里遇到了竞争条件:

LogErr("set AppAgent start");

_AppWebsite = db.Websites
                .Where(x => x.Domain == Request.Url.Host)
                .SingleOrDefault();
LogErr("set AppAgent end");

我的日志显示“set AppAgent start”但不是“set AppAgent start”,因此它挂在数据库访问上。似乎没有例外。

新发布后,挂起/比赛很容易捕捉到。如果我在网站启动时发出多个请求,它通常会挂起。它可能会在其他时间发生,但我无法足够快地发出这些请求,从而在运行后导致挂起。

终止 AppPool 将修复挂起问题。

这是控制器。这是我派生的基本控制器。当然,我删除了很多代码。

我希望有人能告诉我我在这里做错了什么。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;

using System.Threading;
using System.Net;
using System.Web;
using System.Web.Mvc;
using System.Security.Claims;
using System.Globalization;

using PropertyDB;
using PropertyDB.Models;
using PropertyDB.Support;
using PropertySite.Models;
using PropertySite.Support;
using System.IO;

namespace PropertySite.Controllers
{
    public class BaseController : Controller
    {
        protected DataContext db = new PropertyDB.DataContext();
        protected PageModel DefaultPageModel;

        private Website _AppWebsite; //cache for AppWebsite

        public Website AppWebsite
        {
            get
            {
                if (_AppWebsite == null)
                {
                    LogErr("set AppAgent start");
                    _AppWebsite = db.Websites.Where(x => x.Domain == Request.Url.Host).SingleOrDefault();
                    LogErr("set AppAgent end");
                }
                return _AppWebsite;
            }
        }

        public BaseController()
        {
        }

        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            //init model for page

            string RequestPath = Request.Path;
            DefaultPageModel = new PageModel()
            {
                Website = AppWebsite,
                Route = RequestPath.Substring(1).Split('/'),
            };

            string PagePath = DefaultPageModel.Route[0];
            DefaultPageModel.Page = db.Pages
                                      .Where(x => x.WebsiteId == AppWebsite.Id)
                                      .Where(x => x.Path == PagePath)
                                      .SingleOrDefault();
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (db != null)
                {
                    db.Dispose();
                    db = null;
                }
            }

            base.Dispose(disposing);
        }
    }
}

它正在查询的表如下。 该表有 5 条记录。

CREATE TABLE `websites` (
  `Id` int NOT NULL AUTO_INCREMENT,
  `SellerId` int NOT NULL,
  `Name` varchar(45) NOT NULL,
  `Domain` varchar(50) DEFAULT NULL,
  `MenuH` varchar(150) DEFAULT '',
  `MenuF` varchar(150) DEFAULT '',
  `CreatedDate` datetime DEFAULT NULL,
  `DeletedDate` datetime DEFAULT NULL,
  `SubEndDate` date DEFAULT '2090-01-01',
  `Logo` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`Id`),
  UNIQUE KEY `i_SellerId` (`SellerId`),
  KEY `i_Domain` (`Domain`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

我尝试将代码从

OnActionExecuting
移动到
Initialize
方法,但没有帮助。

c# mysql asp.net-mvc entity-framework database-locking
1个回答
0
投票

由于一些内务处理,这个问题现在似乎已经解决了。 我正要开始削减应用程序以缩小原因,所以我先做了一些整理。 我不知道确切的原因,但这就是我所做的:

  • 更新了所有 nuget 软件包。 这包括对 EF 和 MySql.data 的许多次要版本更新。
  • 我删除了 web.config 中对 Owin 组件的引用。 nuget 软件包已被卸载,但这些引用仍然存在。
  • 清理项目并重建。

我怀疑是 web.config 中的 owin 引用导致了问题。

© www.soinside.com 2019 - 2024. All rights reserved.