2009-09-09 3 views
2

OutgoingMessageHeaders에 MessageHeader를 쓰려고하는데 그 값이 달라 붙지 않습니다. 내가 두 번 OutgoingMessageHeaders을 설정하고 있음을WCF OutgoingMessageHeaders 값을 저장하지 않습니다.

BasicHttpBinding basicHttpBinding = new BasicHttpBinding(); 
EndpointAddress endpointAddress = new EndpointAddress("http://localhost:1003/Client.svc"); 

IClientService serviceClient = new ChannelFactory<IClientService>(basicHttpBinding, endpointAddress).CreateChannel(); 

// attempt 1 
using (OperationContextScope scope = new OperationContextScope(serviceClient as IContextChannel)) 
{ 
    OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("SessionId","","ABC")); 
} 

// attempt 2 
using (OperationContextScope scope = new OperationContextScope(serviceClient as IContextChannel)) 
{ 
    OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("SessionId","","ABC")); 
} 

OK, 당신은 볼 수 있지만 그 점을 증명하는 것입니다. 두 번째 시도에서 실제 추가 작업을 수행하기 전에 OperationContext.Current.OutgoingMessageHeaders를 검사합니다. 나는 이것이 1 개의 입구를 가지고 있기를 기대할 것이다. 그러나 그것은 0입니다. 사용 범위를 벗어나면 값이 손실됩니다.

이 메시지가 서버로 전달되면 메시지 헤더를 찾을 수 없다는 메시지가 표시됩니다. 메시지 헤더는 찾을 수 없으므로 해당 메시지가 저장되지 않았 음을 나타냅니다.

내 MessageHeader가 고집하지 않는 이유는 무엇입니까?

제프

답변

8

은 Using 블록의 끝은 처분을 호출하고 이전 OperationContext를 재설정합니다.

그래서 당신은 OperationContextScope 내부의 서비스 콜에서 이와 같은 것을 원한다.

 using (OperationContextScope scope = new OperationContextScope(serviceClient as IContextChannel)) 
     { 
      OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("SessionId", "", "ABC")); 
      serviceClient.CallOperation(); 
     } 
+0

정확히 - 실제로 ** 사용 ** 블록 안에있는 호출을 할 필요가 있습니다! –

+0

Arghh. 당연하지! 프록시를 사용할 때 프록시를 사용하는 모든 호출을 변경하지 않아도되기 때문에 한 곳에서이 기능을 설정할 수 있기를 바랬습니다. 행동을 사용하고 메시지를 그런 식으로 조정해야 할 것처럼 보입니다. 그 접근법에서 볼 수있는 문제는 WCF를 사용하지 않는 무언가가 사용할 수있는 서비스 메소드를 멈출 수 있다는 것입니다 :-( –

관련 문제