문제

현재 HTTPContext를 사용하여 LINQ 데이터 컨텍스트를 저장하는 웹 앱이 있습니다. 컨텍스트는 현재 요청에 따라 사용자 기준으로, Rick Strahl의 블로그:

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString("x")  
Thread.CurrentContext.ContextID.ToString();

if (!HttpContext.Current.Items.Contains(ocKey))
{
    // Get new Data Context and store it in the HTTP Context
}

그러나 Global.asax 파일에서 실행하는 스크립트가 있습니다. 가지고 있지 않습니다 httpcontext. httpcontext.current는 null입니다, 서버가 "요청"을 만드는 서버이기 때문에.

데이터 컨텍스트를 저장하는 데 사용할 수있는 동등한 객체가 있습니까? 그래서 그것을 다시 만들고 물체를 첨부/분리하는 것에 대해 걱정할 필요가 없습니까? 나는 내 과정의 수명에 대한 맥락 만 지속되기를 원한다.

업데이트 :

현재 DAL 헬퍼 클래스에서 정적 변수를 사용하려고합니다. 클래스의 메소드 중 하나에 대한 첫 번째 호출에서 DataContext는 인스턴스화되어 정적 변수에 저장됩니다. 프로세스가 끝나면 DataContext에서 Dispose 호출을 호출하고 정적 변수를 NULL로 설정합니다.

도움이 되었습니까?

해결책

해당 스크립트에 대해 특별히 정적 변수를 사용할 수 없습니까? 그것은 생명 시간이 동일합니다 AppDomain. 동시성 문제에 대해 신중하게 생각해야하지만 가치를 유지하는 가장 간단한 방법처럼 들립니다.

(방금 확인했는데 하나의 인스턴스 HttpApplication 여러 요청을 서비스하는 데 사용할 수 있으며 각 요청은 한 번에 하나의 요청 만 제공합니다. 이는 동시 요청 처리를 위해 여러 인스턴스가 생성됨을 시사합니다. 나는 이것을 검증하지 않았지만 인스턴스 변수에 보관하는 것이 안전하지 않은 것처럼 들립니다.)

편집 : Josh의 대답은 이것이 당신이 이것을 스레드 당이기를 원한다고 제안합니다. 당신이 가지고 있지 않으면 나에게 약간 이상하게 들립니다. 많은 이러한 사건들 중에서, 당신은 그들이 다른 스레드에서 실행되는 것을 볼 가능성이 높으므로 전체 공유 비즈니스를 무의미하게 만듭니다. 당신이 정말로 그런 종류의 것을 원한다면, 나는 단지 인스턴스 변수를 사용하는 것이 좋습니다. HttpApplication- 유래 클래스 - 위의 단락에 설명 된 이유에 대해 :)

다른 팁

현재 HTTPContext를 사용하지 않겠습니까? Global.asax 파일의 스크립트는 모든 요청이 서버에 들어오는 결과이므로 해당 요청과 관련된 컨텍스트가 있어야합니다.

해시 코드 또는 스레드를 기반으로 키를 생성 할 필요성을 이해하지 못합니다. 각 요청에 대해 별도의 HTTPContext 인스턴스가있을 것이며 해당 인스턴스는 요청을 처리하는 스레드에만 해당됩니다. 이 때문에 httpcontext 인스턴스와 스레드를 기반으로 할 때 키는 거의 가치가 없습니다.

또한 완료되면 Datacontext를 어떻게 처리합니까? 이유가 있으므로 Idisposable을 구현하므로 이와 같은 공유 인스턴스를 추천합니다.


업데이트

주석에는 스크립트를 실행하는 타이머가 있음을 나타냅니다. 타이머 대신에 작업을 수행 할 사이트에서 웹 서비스 또는 미리 정해진 페이지를 호출하는 예정된 작업을 설정하는 것이 좋습니다. 그런 다음 항상 HTTPContext와 함께 작업 할 것입니다.

httpcontext.current는 정적 방법이며 요청의 컨텍스트 내에서 코드가 실행되는 한 어디서나 사용할 수 있어야합니다.

귀하의 경우 요청의 컨텍스트 내에서 실행되지 않으면 Application.Cache를 사용하는 것을 볼 수 있지만 DataContext Open을 유지하는 것에 대한주의를 기울일 수 있습니다. 나는 엔티티에 LINQ가있는 Famillar가 아니기 때문에 잘못 될 수 있지만 일반적으로 연결과 같은 데이터베이스 관련 항목을 캐싱하는 것은 나쁩니다.

또한 Logical.asax에서 논리를 옮기고 Windows 서비스로 옮기는 것이 좋습니다. 이를 통해 이러한 작업을 더 많이 제어 할 수 있습니다. 예를 들어 웹 사이트의 Seperatley를 종료 할 수 있습니다.

편집하다

JS가 지적한 것처럼 정적 변수를 사용할 수 있습니다. 또한 threadLocal 속성으로 표시된 인스턴스 변수를 정의 할 수도 있습니다. 이것은 각 스레드에 자체 변수 사본을 제공하고 경합을 제거 할 수 있습니다. 어쨌든 각 스레드에 자체 사본을 갖기를 원하기 때문입니다.

다른 Datacontexts와 같은 방식으로 처리 해야하는 이유가 있습니까? 컨텍스트가 이벤트 처리 루틴 내에서만 필요한 경우에만 필요한 것 같습니다. 특히 Application_start에있는 경우 (귀하의 의견에 따라) 어디서나 캐싱을 귀찮게하지 않을 것입니다. 로컬로 사용하여 필요에 따라 다른 방법으로 전달하십시오.

타이머를 생성 할 때 데이터 콘텍스트를 상태 매개 변수로 설정하십시오. 주석에 게시 한 정보를 기반으로 Datacontext가 다른 것보다 타이머와 더 관련이있는 것 같습니다.

또한 다른 타이머에 대해 동일한 데이터 콘텍스트를 사용하지 마십시오. 다른 타이머의 혼합 수정으로 끝나기 때문입니다. 또한 동일한 타이머 로직이 두 번 실행되지 않도록하십시오. 제어없이 동일한 IE가 너무 짧은 기간을 일으키기 때문입니다.

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