2010-11-22 3 views
2

WCF 서비스에서 채널을 식별해야합니다.WCF - 일부 채널 식별자를 얻는 방법?

한 가지 방법은 Session.SessionID를 사용하는 것입니다.하지만 바인딩을 세션과 함께 사용할 수없는 것 같아서 세션을 달성하기 위해 너무 많은 것으로 보입니다. 나는 채널의 히스토리를 기록하려고하는데, 어떤 메소드가 호출되는지, 그리고 현재 활성화 된 "채널 ID"의 해시를 유지하려고한다.

어떻게 '채널 ID'와 같은 것을 얻을 수 있습니까? '채널 ID'가 명시 적으로 존재하지 않지만 해결 방법은 무엇입니까?

+0

유스 케이스 란 무엇입니까? 이걸로 무엇을 이루고 싶습니까? –

+0

필자가 작성한 것처럼 채널 ID를 기반으로하는 일부 기록 테이블에 로그를 만들려고합니다.이 테이블은 열리는 동안 각 채널에서 어떤 메소드가 호출되었는지 추적합니다. 또한 어떤 채널이 열렸는지를 추적 할 수있는 방법이 있습니다 (일부 비즈니스 로직 용). – veljkoz

+0

저자가 SessionMode가 없다고 오해하지 않으면 세션 콜백 또는 기타 정보를 얻기 위해 OperationContext.Current에 액세스 할 수 없습니다. –

답변

2

다른 트릭, 나는이처럼 '속임수'않습니다 아무것도 이후 :

는 클라이언트 측에서 MessageHeader 추가 : "이름"에서

using (OperationContextScope scope = new OperationContextScope(cli.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("MyHeader", Guid.NewGuid().ToString(), "")); 

    string ret = cli.GetData(1); 
} 

헤더의 속성은 내가 이름을 전달하고자하는 헤더의 값 네임 스페이스로 네임 스페이스를 사용하고 있습니다. (헤더의 'value'에 도달 할 수 없기 때문에 속성으로 노출되지 않습니다.)! 나는 서비스 인스턴스를 만들 때마다 클라이언트 쪽에서이 작업을 수행한다. 서비스에

내가 좋아하는 헤더 읽기 : 그것은 확실히 해킹,하지만 뭔가 더 우아한 만들 시간이있어,이 날 '채널 ID'방식을 유지할 수 있습니다

var head = OperationContext.Current.IncomingMessageHeaders.FirstOrDefault(h => h.Name == "MyHeader"); 
string channelId = head.Namespace; 

를 I 그것을 제어 할 수 있습니다 ... 그것은 추한 솔루션입니다 그리고 나는 그것을 좋아하지 않아, 그래서 누군가가 뭔가 더 나은 발견 할 때마다 나는 그것을 감사하겠습니다 ...

편집 : 나는 발신/IncomingMessageProperties를 사용하여 시도하지만 '아무튼 작동하지 않는 것 같습니다 - 서버 측에서 찾을 수있는 곳이 없습니다 ... 아마 뭔가 누락 된 것 같습니다 ...

+3

이것은 네임 스페이스를 통해 해킹하지 않고 헤더 값을 얻는 방법입니다. Guid myChannelID = OperationContext.Current.IncomingMessageHeaders.GetHeader ("MyHeader", "http : // example/my-header /"); –

+0

@velijkov : 내 모든 크리스마스 '가 즉시 왔습니다. 네. –

0

string sessionID = OperationContext.Current.SessionId;을 사용해 보셨습니까?

+0

세션이 없다면 존재하지 않습니다. 내 경우 - 나는 정말로 세션을 원하지 않는다. – veljkoz

+0

세션을 사용하지 않으므로 콜백 주소, 호출 된 인터페이스 및 현재 시간 만 로그 다운하면됩니다. 그게 네가 쫓아 온거야? –

+0

콜백 주소로 충분할 수 있지만 사용자/채널을 유효하게 식별 할 수 있을지 확실하지 않습니다. 사용자가 서비스를 사용하는 두 개의 응용 프로그램을 가지고 있다면 어떻게 될까요? 그들 사이에 구별 할 수있는 방법이 없습니다 – veljkoz

0

OperationContext.Current.Channel.GetHashCode()은 귀하의 목적에 맞을 수도 있습니다.

+0

이 값은 항상 각 채널에 대해 동일한 해시 값을 반환합니다. 어떤 채널은 다른 채널과 차별화되는 것이 아니라는 결론을 내리게됩니다. – veljkoz

+0

... 또는 모든 요청이 동일한 채널에서 처리되고 있습니까? 어떤 바인딩을 사용하고 있습니까? –

+0

basicHttpBinding -하지만 앱을 다시 시작하더라도 채널 해시는 그대로 유지됩니다. – veljkoz