2014-06-12 2 views
0

그러나 기존 ASP 응용 프로그램에서 문제를 해결하려고 시도했지만 경험이 없습니다. 더 많은 정보를 찾으려고했으나 할 수 없었습니다.클래식 ASP에서 스레드 안전하지 않은 COMobject에 액세스

이 응용 프로그램은 스레드로부터 안전하지 않은 데이터 검색을 위해 COM 객체를 인스턴스화하므로 다음 지침이 추가됩니다. 동시에 두 개의 다른 HTTP 요청을 처리 할 때

comObject=CreateObject("comServer.comObject") 
returnValue=comObject.DoWork(.......) 
... 
comObject = Nothing 

그러나, 후자는 제 요청자에게 오류를주는 제 요청을 겹쳐 보인다. comObject 변수가 요청간에 공유되는 것처럼 보입니다.

IIS의 모든 개별 요청이 comObject의 자체 인스턴스를 가져 오는 방식으로 개체를 인스턴스화하는 방법은 무엇입니까?

답변

1

개체가 무엇을하는지 또는 어떻게 처리하는지 모른 채 구체적인 조언을하는 것은 불가능합니다. 일반적인 설명은 다음과 같습니다.

개체가 깨지거나 버그가 있습니다. 문제를 처리하는 것은 객체의 책임입니다.

COM 개체는 모든 스레딩 문제를 내부적으로 처리하거나 COM STA 아파트를 수행 할 수 없거나 STA에서 처리 할 수없는 경우에 연기하기를 원합니다. 이것은 물체의 디자인에 깊이 들어갑니다.

COM 아파트 선택에 관계없이 동시 호출을 처리하는 별도의 스레드에있는 여러 개의 개별 COM 개체를 배제하는 의미를 가진 DoWork (...) 메서드는 기껏해야 심각하게 문제가되는 디자인입니다. 올바른 디자인은 충돌을 명시 적으로 처리하거나 호출 코드에서 충돌을 숨기고 내부적으로 충돌을 처리하는 메커니즘을 포함합니다.

DoWork()의 ​​세부 사항에 따라 호출을 병렬로 처리하거나 호출을 효과적으로 직렬화 할 수 있도록 객체를 수정하거나 두 번째 호출에서 "You called already call me"오류가 발생합니다. 다시 말하지만, 어떤 방법이 더 적합한가에 따라 더 적절합니다.

이 깨진 구성 요소를 수정할 수없는 경우 가장 좋은 방법은 실제 개체에 대한 직렬화를 보장하는 COM 래퍼를 작성하는 것입니다.

어쨌든 클라이언트 (ASP VBScript) 측에서 할 수있는 일은 아무 것도 없습니다.

관련 문제