2010-02-07 5 views
1

WCF 서비스를 설계하고 있습니다. netTCP 바인딩을 사용하고 있습니다. 서비스는 멀티 스레드 클라이언트에서 호출 될 수 있습니다. 다중 스레드 클라이언트가 프록시를 공유하지 않습니다.WCF 디자인 질문

1. WCF 서비스 설계 질문.

클라이언트는 모든 호출에서이 두 값인 UserID 및 SourceSystemID를 전송해야합니다. 이렇게하면 서비스가 사용자와 사용자가 속한 시스템을 식별하는 데 도움이됩니다. 모든 호출에서이 두 값을 전달하는 대신 클라이언트에서 호출하는 동안 서비스와 함께 캐시되도록 결정했습니다. 이 기사에서 설명한대로 서비스에 대한 매개 변수화 된 생성자를 지정하고이 값을 ChannelContext에 저장하기로 결정했습니다. http://www.danrigsby.com/blog/index.php/2008/09/21/using-icontextchannel-extensions-to-store-custom-data/

처음에는 세션에 값을 저장하고 초기화 및 종료 방법을 알고 싶었습니다. 그러나 거기에서 각각의 경우에 수동으로 세션을 정리해야한다는 것을 알게되었습니다. 채널 컨텍스트에 값을 저장할 때마다 매번이를 정리할 필요가 없으며 채널이 닫히면 저장된 값이 이미 파괴됩니다. 누군가 내 가정에서 내가 맞는지 확인할 수 있습니까?

2. SessionMode를 사용해야합니까? 계약서에는 [ServiceContract (SessionMode = SessionMode.Required)]를 사용했으며이 서비스 특성은 사용하지 않았습니다.

내 선택에 관계없이 항상 다음 값을 찾습니다. System.ServiceModel.OperationContext.Current.SessionId 어떻게 설명 할 수 있습니까?

내가 SessionMode.Required라고 말하면 내 InstanceContextMode가 자동으로 PerSession으로 변경됩니까?

3. InstanceContextMode를 사용 하시겠습니까? (1)에서 언급 한 것처럼 채널 컨텍스트에 일부 값을 저장한다는 점을 제외하면 내 서비스는 상태 비 저장입니다. Percall 또는 PerSession을 InstanceContextMode로 사용해야합니까?

답변

1

netTcp에는 항상 전송 레벨 세션이 있습니다. 그래서 항상 SessionId가 있습니다. 그래서 기본적으로, 당신이 무엇을 선택하든간에, netTcp를 사용하면 전송 레벨에서 세션 연결을 바로 사용할 수 있습니다.

InstanceContextMode는 SessionId 이외의 다른 세션에서 필요로하지 않는 한 신뢰할 수있는 메시징 등이 없습니다. 일반적으로 Per-Call을 선택합니다. 확장 성이 뛰어나며 일반적으로 성능이 뛰어납니다. 걱정할 필요가있는 "접착제"를 줄이고 관리해야하는 조각을 줄여줍니다.

신뢰할 수있는 메시징 또는 절대적으로 WCF 세션이 필요한 다른 항목을 설정해야하는 경우에만 명시 적으로 필요한 세션을 사용합니다. 당신이하지 않는다면 - 그건 단지 불필요한 오버 헤드 일뿐입니다.

1

SessionMode를 SessionMode.Required로 설정하면 NetTcpBinding, WSHttpBinding 등과 같은 세션을 지원하는 바인딩을 사용하도록 설정됩니다. 실제로 세션을 사용할 수없는 바인딩을 사용하려고하면 런타임시 예외가 발생합니다 주인.

InstanceContextMode를 PerSession으로 설정하면 세션 당 하나의 인스턴스 만 작성되고 해당 인스턴스는 해당 세션에서 오는 모든 요청을 처리합니다.

런타임에서 SessionId를 설정하면 전송 세션이나 안정적인 세션 또는 보안 세션이있을 수 있습니다. 이 두 가지가 반드시 응용 프로그램 세션을 갖는 것은 아닙니다. 즉, 프록시 당 요청을 처리하는 단일 서비스 개체입니다. 즉, InstanceContextMode = PerCall을 설정하여 응용 프로그램 세션을 해제하면 netTcpBinding 또는 신뢰할 수있는 보안 세션을 사용하여 전송 세션을 유지하면서 모든 호출에 대해 새 서비스 개체 생성을 강제 수행 할 수 있습니다.

낮은 수준의 세션/보안, 전송 또는 안정적인 /에 의존하는 더 높은 수준의 세션으로 InstanceContextMode 및 세션 모드에 의해 구성된 응용 프로그램 세션을 생각해보십시오. 응용 프로그램 세션은 다른 세션 중 하나를 제자리에 두지 않고 실제로 바인딩을 요구할 수 없습니다.

이미 약간 시간이 걸렸지 만 간단한 값으로는 응용 프로그램 세션을 만드는 대신 매번 값을 전달하는 것이 좋습니다. 그러면 서비스 개체의 수명이 짧아지고 불필요한 리소스가 서버에 유지되지 않습니다. 더 많은 고객이나 프록시가 서비스와 대화하는 것이 의미가 있습니다. 또한 클라이언트에 항상 값을 캐시 할 수 있으며 원하는 경우 사용자 지정 헤더로 전달할 수도 있습니다.

+0

세션에 대한 훌륭한 통찰에 감사드립니다. 현재 전송 수준 세션을 사용 중이며 PerCall을 사용하여 응용 프로그램 세션을 사용하지 않도록 설정했습니다. –