programing

정적 클래스 인스턴스는 ASP.NET의 요청 또는 서버에 고유합니까?

telebox 2023. 5. 27. 10:37
반응형

정적 클래스 인스턴스는 ASP.NET의 요청 또는 서버에 고유합니까?

ASP.NET 웹 사이트에서 정적 클래스는 각 웹 요청에 고유합니까? 아니면 필요할 때마다 인스턴스화되고 GC가 해당 클래스를 폐기하기로 결정할 때마다 GC화됩니까?

제가 질문하는 이유는 제가 이전에 C#에서 정적인 수업을 작성한 적이 있는데 제가 예상했던 것과 행동이 다르기 때문입니다.저는 정적 수업이 각각의 요청에 따라 고유할 것이라고 예상했지만, 그렇지 않은 것 같습니다.

각 요청에 고유하지 않은 경우, 고유하게 허용할 수 있는 방법이 있습니까?

업데이트:
드라이스가 내게 준 대답은 바로 내가 필요로 하는 것이었습니다.저는 이미 싱글톤 클래스를 사용하고 있었지만, 정적 인스턴스를 사용하고 있었기 때문에 사용자가 달라도 요청 간에 공유되고 있었습니다. 이 경우는 좋지 않았습니다.사용.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;
        }
    }
}

정적 클래스 및 정적 인스턴스 필드는 응용프로그램에 대한 모든 요청 간에 공유되며 응용프로그램 도메인과 수명이 같습니다.따라서 정적 인스턴스를 사용할 때는 동기화 문제 등이 있을 수 있으므로 주의해야 합니다.또한 애플리케이션 풀을 재활용하기 전에 정적 인스턴스는 GC'ed가 되지 않으므로 정적 인스턴스에서 참조되는 모든 항목은 GC'ed가 되지 않습니다.이로 인해 메모리 사용 문제가 발생할 수 있습니다.

요청과 수명이 같은 인스턴스가 필요하다면 다음을 사용할 것을 제안합니다.HttpContext.Current.Items수집.이것은 당신이 요청하는 동안 필요한 물건들을 보관하는 장소가 되도록 설계되었습니다.더 나은 디자인과 가독성을 위해 Singleton 패턴을 사용하여 이러한 항목을 관리할 수 있습니다.인스턴스를 저장하는 Singleton 클래스를 만듭니다.HttpContext.Current.Items(ASP.NET용 공용 라이브러리에는 이 목적을 위한 일반 SingletonRequest 클래스가 있습니다.)

정적 구성원은 현재 작업자 프로세스의 범위만 가지고 있으므로 동일한 작업자 프로세스에서 서로 다른 요청을 처리할 수도 있고 처리하지 않을 수도 있기 때문에 요청과 관련이 없습니다.

  • 특정 사용자 및 요청 간에 데이터를 공유하려면 HttpContext를 사용합니다.현재의.세션.
  • 특정 요청 내에서 데이터를 공유하려면 HttpContext를 사용합니다.현재의.항목들.
  • 전체 응용 프로그램에서 데이터를 공유하려면 이에 대한 메커니즘을 작성하거나 단일 프로세스에서 작동하도록 IIS를 구성하고 싱글턴/애플리케이션을 사용합니다.

그런데, 기본 작업자 프로세스 수는 1이므로, 정적 구성원이 전체 응용 프로그램의 범위를 가지고 있다고 생각하는 사람들로 웹이 가득 찬 이유입니다.

유형이 앱 도메인에 포함되어 있기 때문에 앱 도메인이 재활용되지 않거나 요청이 다른 앱 도메인에서 제공되는 경우 정적 클래스가 존재할 것으로 예상합니다.

원하는 작업에 따라 특정 요청에 특정 개체를 지정하는 몇 가지 방법을 생각할 수 있습니다. 예를 들어 응용 프로그램에서 개체를 인스턴스화할 수 있습니다.요청을 시작한 다음 요청 처리 파이프라인의 모든 개체가 액세스할 수 있도록 HttpRequest 개체에 저장합니다.

각 요청에 고유하지 않은 경우, 고유하게 허용할 수 있는 방법이 있습니까?

아니요. 정적 멤버는 ASP.NET 프로세스에 의해 소유되며 웹 앱의 모든 사용자가 공유합니다.세션 변수와 같은 다른 세션 관리 기법으로 전환해야 합니다.

방법, 및 는 일적으로메드소, 속및클에일다니입적에서 됩니다.Application수준. 응용 프로그램이 지속되는 한 공유됩니다.

를사하다동지수있습다니정할작을을 사용하여 할 수 .ThreadStatic기하다 ▁in다▁. 그렇다면 에 대해 스레드에 대해 이 될이 경우에는 각 요청에 대해 특정한 현재 스레드에 대해 특정하게 됩니다.
하지만 이것은 너무 복잡해 보이기 때문에 조언하지 않을 것입니다.

사용할 수 있습니다.HttpContext.Current.Items요청에 하거나, 또는 내설용정거나하을대한요청에의하나,▁up▁to나,거나▁set.HttpContext.Current.Session한 명의 사용자에 대한 항목을 설정합니다(추가 요청).

하지만 일반적으로, 당신이 사용할 필요가 없는 한.Server.Transfer가장 좋은 방법은 기본적으로 한 번 생성한 다음 메서드 호출을 통해 명시적으로 전달하는 것입니다.

언급URL : https://stackoverflow.com/questions/194999/are-static-class-instances-unique-to-a-request-or-a-server-in-asp-net

반응형