Почему я получаю состояние гонки/зависание в этом контроллере ASP.NET MVC?C#

Место общения программистов C#
Ответить
Anonymous
 Почему я получаю состояние гонки/зависание в этом контроллере ASP.NET MVC?

Сообщение Anonymous »

Это в 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");
В моем журнале отображается «установить запуск AppAgent», но не «установить запуск AppAgent», поэтому он зависает при доступе к базе данных. Похоже, это не исключение.
Зависание/гонку легко обнаружить после новой публикации. Если я делаю несколько запросов во время запуска сайта, он обычно зависает. Вероятно, это произошло бы и в другое время, но я не могу выполнить эти запросы достаточно быстро, чтобы вызвать зависание после его запуска.
Уничтожение 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, но это не помогло.

Подробнее здесь: https://stackoverflow.com/questions/791 ... controller
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»