2010-06-25 3 views
7

요청이 WCF 서비스에 도착했을 때 CallContext를 사용하고 (예 : 호출 시작 부분에 후크를 사용하여 Inspector/ContextBoundObject를 사용하여) 특정 호출 데이터로 초기화 한 다음 호출에서 다시 사용하면 안전합니다. 내가 액세스하는 데이터가 항상 같은 데이터인지 보장해야합니다.WCF의 CallContext

감사합니다, 파블

답변

7

당신이 원격을 사용하거나 응용 프로그램 도메인 경계를 교차하지 않는 경우가 있지만, 그때는 안전해야 사찰에서 사용하지 않을 경우는 그냥 스레드 정적 필드를 사용하는 아마 간단합니다 . 정적 필드에 ThreadStaticAttribute을 넣으면 각 스레드의 별도 저장 위치가됩니다.

예를 들어 IDispatchMessageInspector에 값을 설정하려는 경우 요청에서 별도의 스레드에서 실행되므로 값이 작동하지 않습니다. OperationContext에서 WCF 요청에 대한 호출 관련 정보를 제공합니다. IExtension<OperationContext>을 구현하고 확장 속성에 추가하여 사용자 지정 데이터를 저장할 수있는 확장을 추가 할 수 있습니다. OperationContext에 사용자 정의 데이터를 추가하는 방법을 설명하는 Here is a blog post.

+0

감사합니다. AOP 및 ContextBoundObject를 사용하여 솔루션을 설계했습니다. 애스펙트 클래스 메서드 SyncProcessMessage에서 작업 범위 속성을 설정합니다. CallContext.SetData ("workspaceManager", _workspaceManager); 그러면 안전할까요? – dragonfly

+1

나를 괴롭히는 또 다른 문제는 ... asp.net 웹 응용 프로그램에서 하나의 요청이 하나 이상의 스레드를 사용하는 서버가 될 수 있다고합니다 (threds switching과 같은 것?). WCF 호스트 환경과 동일하지 않습니까? 작업이 처리 될 때 어떤 지점을 일시 중단 한 후 다른 스레드를 사용하여 재개 할 수 있습니까? – dragonfly

+3

내가 작업하는 응용 프로그램의 레거시 코드는 WCF 작업 내에서 CallContext에 사용자 별 상태를 저장하는 것입니다. 우리의 WCF 서비스는 IIS에서 호스팅되기 때문에 다른 스레드에서 다른 WCF 작업이 실행되며 IIS 스레드 풀에서 다시 사용됩니다. 우리는 특정 작업이 다른 사용자와 관련된 사용자 데이터를 수집하는 일부 산발적 인 동작을 발견했습니다. 이것은 WCF 작업의 수명 동안 만 유효한 OperationContext 대신 CallContext를 잘못 사용하는 코드 때문이었습니다. 추적하기가 힘들었지 만 OperationContext로 변경하면 해결되었습니다. – ozziepeeps