2008-10-08 3 views
0

저는 asp.net 웹 사이트에서 일하고 있습니다. 레거시 vb6 액티브 X 구성 요소와 상호 작용하려면 com interop을 사용해야합니다. 대부분의 경우 구성 요소는 컨텍스트 개체 (즉, vb6 액티브 구성 요소)를 매개 변수로받는 것에 의존합니다. 컨텍스트 객체는 구축하는 데 상당히 비싸다.ASP.NET 세션 및 COM interop을 사용하는 개체 저장

따라서 하나의 개념은 컨텍스트 개체가 한 번 생성되고 asp.net 세션에 저장된다는 것입니다. 그러나이 객체가 activex 구성 요소를 둘러싼 .net 래퍼 인 경우 세션에서 그러한 객체를 유지하는 것이 현명하거나 권장 할 만합니까?

또한 컨텍스트 개체에는 사용자 별 정보가 들어 있으므로 .net HttpRuntime Caching을 사용하여 유지할 수 있지만 사용자 별 키가 필요합니다.

다른 제한 사항과 asp.net 세션, aspnet-session question에 대해 알아야 할 사항을 알고 있습니다.

약간 다른 방식으로 문의하십시오. com 객체를 둘러싼 래퍼 인 .net 객체를 저장하는 데있어 모든 문제 또는 문제가 있습니까?

답변

3

저는 한 요청이 다른 요청을 막는 데 아주 빨리 문제가 발생할 것이라고 생각합니다.

ASP.NET은 기본적으로 스레드를 COM에 초기화하여 스레드를 다중 스레드 아파트에 배치합니다. VB6 구성 요소는 기껏해야 아파트 모델이었습니다. 즉, MTA 스레드가 구성 요소를 만들면 해당 구성 요소가 이미있는 경우 (ASP.NET 작업자 프로세스의 경우에는 그렇지 않음) 또는 STA 전용으로 새 스레드가 만들어지면 주 STA에 배치됩니다. 어떤 MTA 스레드가 구성 요소를 생성하는지는 중요하지 않으며 MTA 모델을 처리 할 수없는 구성 요소에는 항상 동일한 STA가 사용됩니다. 즉, 해당 구성 요소에 대한 모든 호출에 동일한 스레드가 사용되므로 동시 호출이 줄을 서서 기다려야합니다.

적어도 스레드가 실행중인 페이지와 동일한 스레드에서 만들어 지도록하는 단일 스레드 구성 요소에 대해 COM을 초기화하도록 ASP.NET에 알리려면 AspCompat 특성을 @Page 지시문에 추가하십시오.

개체를 재사용 할 때 크로스 스레드 문제가 발생할 가능성이 높기 때문에 개체를 캐시하지 않습니다.

+0

감사합니다. 마이크, 매우 유용한 정보. – Jon

0

원하는 효과가없는 한 사용자 당 한 번 구성되지 않는 방식으로 캐시에 유지합니다.

+0

여기에는 사용자 별 정보가 들어 있습니다. 따라서 세션 간에는 공유 할 수 없습니다. 더 명확하게해야합니다. – Jon