2013-04-07 2 views
2

정말 내 계약에 추가 매개 변수를 추가하지 않고 WCF 서비스에 토큰을 전달할 수 있어야합니다. 예를 들어 나중에 내 서비스에서 사용할 수 있도록 숫자와 같은 값을 지정해야합니다.토큰을 WCF 서비스에 전달

+0

오 대단한 질문 –

답변

1

이 문제는 맞춤 헤더를 사용하여 해결됩니다.

당신과 같이 클라이언트에 사용자 정의 헤더를 지정할 수 있습니다

  IContextChannel contextChannel = (IContextChannel)myServiceProxy; 
      using (OperationContextScope scope = new OperationContextScope(contextChannel)) 
      { 
       MessageHeader header = MessageHeader.CreateHeader("PlayerId", "", _playerId); 
       OperationContext.Current.OutgoingMessageHeaders.Add(header); 
       act(service); 
      } 

을 서비스에 당신이이 값을 얻을 수 있습니다 : 또한 사용자 정의를 설정하는 방법에 대한 this question를 참조

private long ExtractPlayerIdFromHeader() 
    { 
     try 
     { 
      var opContext = OperationContext.Current; 
      var requestContext = opContext.RequestContext; 
      var headers = requestContext.RequestMessage.Headers; 
      int headerIndex = headers.FindHeader("PlayerId", ""); 
      long playerId = headers.GetHeader<long>(headerIndex); 
      return playerId; 
     } 
     catch (Exception ex) 
     { 
      this.Log.Error("Exception thrown when extracting the player id from the header", ex); 
      throw; 
     } 
    } 

을 헤더를 구성 파일을 통해.

2

한 가지 방법은 WCFExtras을 사용하고 비누 머리글에 값을 넣는 것입니다.

[SoapHeader("MyToken", typeof(Header), Direction = SoapHeaderDirection.In)] 
[OperationContract] 
string In(); 

이렇게하면 WSDL에서 서비스 동작에 필요한 토큰을 분명하게 나타낼 수 있습니다.

또 다른 옵션은 HTTP headers을 사용하는 것입니다.이 방법은 메소드를 전혀 고려하지 않고 수행 할 수 있습니다. 단점은 토큰이 WSDL에 나타나지 않으므로 서비스가 WSDL에 의해 더 이상 완전히 기술되지 않는다는 것입니다.

관련 문제