проблема с адресным фильтром в WCF - PullRequest
1 голос
/ 31 марта 2010

Я создал свой собственный канал WCF со всеми необходимыми вещами (такими как кодеры, привязки и т. Д.), Чтобы использовать его с ServiceHost.

Я просто хочу построить «стек каналов», не делая кастомизации в «Сервисной модели». Чтобы достичь этого, мой кодировщик возвращает совершенный 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:
«Сообщение с To» не может быть обработано в получателе из-за несоответствия AddressFilter в EndpointDispatcher. Проверьте, совпадают ли конечные адреса отправителя и получателя.

Я прочитал, что EndPointDispatcher.AddressFilter по умолчанию просто просматривает заголовок «TO» и доставляет сообщение в соответствующую службу. Это происходит с другими привязками, почему не происходит и с моим собственным каналом?

Есть ли способ проверить, что делает AddressFilter по умолчанию?

Спасибо

1 Ответ

2 голосов
/ 31 марта 2010

Эта проблема заключается в том, как я создавал сообщение:

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. Заголовок «Кому» должен быть указан следующим образом:

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

Трудно обнаружить ошибку, потому что когда мы смотрим на message.ToString (), мы видим все в нужном месте ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...