На веб-сайте ASP.NET являются статическими классами, уникальными для каждого веб-запроса, или они создаются при необходимости и GCed всякий раз, когда GC решает избавиться от них?Являются ли экземпляры статического класса уникальными для запроса или сервера в ASP.NET?
Причина, по которой я спрашиваю, состоит в том, что раньше я писал некоторые статические классы в C#, и поведение отличается от того, что я ожидал. Я бы ожидал, что статические классы будут уникальными для каждого запроса, но похоже, что это не так.
Если они не являются уникальными для каждого запроса, есть ли способ позволить им быть?
UPDATE:
Ответ driis дал мне именно то, что мне было нужно. Я уже использовал одноэлементный класс, однако он использовал статический экземпляр и поэтому делился между запросами, даже если пользователи были разными, что в этом случае было плохим. Использование HttpContext.Current.Items
прекрасно решает мою проблему. Для тех, кто натыкается на этот вопрос в будущем, вот моя реализация, упрощены и сокращены, так что легко понять закономерность:
using System.Collections;
using System.Web;
public class GloballyAccessibleClass
{
private GloballyAccessibleClass() { }
public static GloballyAccessibleClass Instance
{
get
{
IDictionary items = HttpContext.Current.Items;
if(!items.Contains("TheInstance"))
{
items["TheInstance"] = new GloballyAccessibleClass();
}
return items["TheInstance"] as GloballyAccessibleClass;
}
}
}
Просто голова: если вы перенаправляете свой запрос, скажем, с помощью `filterContext.Result = new RedirectResult (...)`, вы потеряете свои элементы, потому что будет создан новый HttpContext. Подробнее здесь: https://stackoverflow.com/questions/16697601/response-redirect-does-not-preserve-httpcontext-current-items – 2018-03-01 18:22:30