문제

하나의 인스턴스만 인스턴스화하면 되는 공통 도우미 클래스를 모두 공유하는 일부 ASP.NET 웹 서비스가 있습니다. 서버당.이는 데이터의 간단한 변환에 사용되지만 시작하는 동안 web.config 파일 등에서 항목을 로드하는 데 시간이 걸립니다. 도우미 클래스는 100% 스레드로부터 안전합니다.이를 유틸리티 호출의 간단한 라이브러리로 생각하십시오.클래스에서 모든 메소드를 공유하도록 하겠지만 web.config에서 초기 구성을 로드하고 싶습니다. 우리는 15명의 작업자로 구성된 Web Garden과 함께 응용 프로그램 풀을 사용하여 IIS 6.0에 웹 서비스를 배포했습니다.

Global.asax에서 도우미 클래스를 Private Shared 변수로 선언하고 다음과 같이 지연 로드 Shared ReadOnly 속성을 추가했습니다.

Private Shared _helper As MyHelperClass

Public Shared ReadOnly Property Helper() As MyHelperClass
    Get
        If _helper Is Nothing Then
            _helper = New MyHelperClass()
        End If
        Return _helper
    End Get
End Property

생성자에 로깅 코드가 있습니다. MyHelperClass(), 동일한 스레드에서도 각 요청에 대해 실행 중인 생성자를 보여줍니다.ASP.NET의 일부 주요 세부 사항이 누락된 것 같지만 MSDN은 별로 도움이 되지 않았습니다.

나는 두 가지를 모두 사용하여 비슷한 일을 시도했습니다. Application("Helper") 그리고 Cache("Helper") 그리고 나는 여전히 각 요청마다 생성자가 실행되는 것을 보았습니다.

도움이 되었습니까?

해결책

꼭 필요한 경우가 아니면 애플리케이션 상태를 사용하는 것은 현명하지 않습니다. 요청별 객체를 계속 사용하면 상황이 훨씬 더 간단해집니다.도우미 클래스에 상태를 추가하면 모든 종류의 미묘한 오류가 발생할 수 있습니다.HttpContext.Current 항목 컬렉션을 사용하고 요청별로 초기화합니다.VB 모듈은 원하는 작업을 수행하지만 상태 저장 모듈로 만들지 않도록 해야 합니다.

다른 팁

도우미를 애플리케이션 상태에 배치할 수 있습니다.global.asax에서 다음을 수행하십시오.

  void Application_Start(object sender, EventArgs e)
  {
    Application.Add("MyHelper", new MyHelperClass());
  }

다음과 같은 방법으로 도우미를 사용할 수 있습니다.

  MyHelperClass helper = (MyHelperClass)HttpContext.Current.Application["MyHelper"];
  helper.Foo();

이로 인해 애플리케이션 시작 시 생성되고 애플리케이션 상태에 있는 MyHelperClass 클래스의 단일 인스턴스가 생성됩니다.인스턴스는 Application_Start에서 생성되므로 요청별로 발생하지 않고 각 HttpApplication 인스턴스에 대해 한 번만 발생합니다.

나는 과거에 내 앱에서 이와 같은 작업을 수행한 적이 있으며 이로 인해 온갖 종류의 이상한 오류가 발생했습니다.모든 사용자는 해당 속성에 있는 다른 모든 사람의 데이터에 액세스할 수 있습니다.또한 한 사용자가 사용 중이고 다른 사용자의 요청으로 인해 연결이 끊어지는 상황이 발생할 수도 있습니다.

아니요, 고립되어 있지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top