2010-03-31 4 views
1

ServiceHost와 함께 사용하기 위해 필요한 모든 항목 (인코더, 바인딩 등)이 포함 된 자체 WCF 채널을 구축했습니다.WCF의 addressfilter 문제

단지 "서비스 모델"에서 우스갯 거리가없는 "채널 스택"을 만들고 싶습니다. 이것을 실현하기 위해, 인코더는 다른 채널과 마찬가지로 XML 인포 세트가있는 완벽한 ServiceModel.Messages를 반환합니다.

[ServiceContract(Namespace = "http://MyNS")] 
    public interface IService1 
{ 
    [OperationContract(IsOneWay = true)] 
    void dummy(); 
} 

public class Service1 : IService1 
{ 
    public void dummy() 
    { 
     Console.WriteLine("In Service1:dummy()"); 
    } 
} 

내가 다른 바인딩을 통해이 서비스를 사용하는 다음과 같은 ServiceModel.Message 내용을 (SOAP 형식) 추적 : 단지 디버깅 (다음

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> 
     <s:Header> 
       <a:Action s:mustUnderstand="1">http://MyNS/IService1/dummy</a:Action> 
       <a:To s:mustUnderstand="1">amqp://localhost</a:To> 
     </s:Header> 
     <s:Body> 
       <dummy xmlns="http://MyNS"></dummy> 
     </s:Body> 
    </s:Envelope> 

는 다음과 같은 서비스 구현을 가정 할 수 있습니다) 필자는 인코더를 allways로 변경하여이 메시지를 반환합니다. 내 맞춤 채널을 사용할 때 :
"수신자가 EndpointDispatcher에서 AddressFilter가 일치하지 않아 수신자가 처리 할 수없는 메시지입니다. 발신자와 수신자의 EndpointAddress가 일치하는지 확인하십시오. "

기본적으로 EndPointDispatcher.AddressFilter는 "TO"헤더를보고 해당 서비스에 메시지를 전달한다는 점을 읽었습니다. 다른 바인딩에서도 이러한 현상이 발생합니다. 내 맞춤 채널에서도 이러한 현상이 발생하지 않습니까?

기본 AddressFilter가 수행중인 작업을 확인할 방법이 있습니까? 이 문제는 내가 메시지를 생성 한 방법이다

감사

답변

2

:

SimpleMessageBody body = new SimpleMessageBody("<dummy xmlns=\"http://MyNS\"></dummy>"); 

Message message = Message.CreateMessage(MessageVersion.Default, "http://MyNS/IService1/dummy", body); 
MessageHeader toHeader = MessageHeader.CreateHeader("a:To", "", "amqp://localhost/", true); // DON'T DO THIS!!! 
message.Headers.Add(toHeader); 

"작업"및 "받는 사람"특정 메시지 클래스 필드에 저장 WCF 특별한 헤더입니다. "받는 사람"헤더는 다음과 같이 지정해야합니다 :

message.Headers.To = new Uri("amqp://localhost/"); 

우리가 message.ToString()에 보면 우리가 올바른 위치에 모든 것을보기 때문에 버그를 감지 할 하드 ...