2010-03-31 66 views
1

我已经构建了自己的WCF通道,包含所有必需的东西(如编码器,绑定等),以便在ServiceHost中使用它。WCF中的地址过滤器问题

我只是想在“服务模型”中建立“通道堆栈”而不做任何定制。为了实现这一点,我的编码器像其他通道一样返回完美的ServiceModel.Messages和XML信息。

让我们假设以下服务实现:

[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> 

然后(只是为了调试)我改变了我的编码器,总是返回这个消息。当我使用我的自定义频道时,WCF的运行时重播带有一个faul消息:
由于EndpointDispatcher中的AddressFilter不匹配,“To的消息”无法在接收方处理。请检查发送方和接收方的EndpointAddresses是否同意。 “

我看到默认的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(),我们在正确的地方看到的一切......