Переписывание сообщения WCF с использованием IClientMessageInspector

1

Я звоню в веб-службу поставщика, а схема их вызовов требует создания пользовательских пространств имен в теге body следующим образом:

<s:Body xmlns:ddw="http://www.infinity.com/bpm/model/OmniLinkServices/DDWEBCallInput" 
        xmlns:omn="http://eclipse.org/stardust/models/generated/OmniLinkServices">

Я не смог найти хороший способ с помощью конфигураций атрибутов, конфигураций связывания и т.д., Чтобы добавить это пространство имен, поэтому я создал реализацию IClientMessageInspector для добавления пространств имен в тег body. Он работает, но тогда тело сообщения становится:

<s:Body xmlns:ddw="http://www.infinity.com/bpm/model/OmniLinkServices/DDWEBCallInput" 
   xmlns:omn="http://eclipse.org/stardust/models/generated/OmniLinkServices">
   ... stream ...
</s:Body>

Обратите внимание на нечетное... поток... содержимое тела.

Это моя реализация BeforeSendRequest на IClientMessageInspector

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
        //Copy old message into XPathNavigator so as first step in transforming it to (newer) XDocument for modification
        Message newMessage = null;
        MessageBuffer msgbuf = request.CreateBufferedCopy(int.MaxValue);
        XPathNavigator nav = msgbuf.CreateNavigator();

        //load the old message into message stream via XmlWriter
        MemoryStream ms = new MemoryStream();
        XmlWriter xw = XmlWriter.Create(ms);
        nav.WriteSubtree(xw);
        xw.Flush();
        xw.Close();
        ms.Position = 0;

        //load the XDocument from the XmlREader
        XDocument xDoc = XDocument.Load(XmlReader.Create(ms));
        ms.Close();

        //add the sungard namespaces to the body of the message
        var body = (from x in xDoc.Descendants() where x.Name.LocalName == "Body" select x).First();
        var ddwns = new XAttribute(XNamespace.Xmlns + "ddw", "http://www.infinity.com/bpm/model/OmniLinkServices/DDWEBCallInput");
        var omnns = new XAttribute(XNamespace.Xmlns + "omn", "http://eclipse.org/stardust/models/generated/OmniLinkServices");
        body.Add(ddwns);
        body.Add(omnns);

        //create the new message
        //write the XDoc back out to memory stream
        MemoryStream newMsg = new MemoryStream();
        xw = XmlWriter.Create(newMsg);            
        xDoc.Save(xw);
        xw.Flush();
        xw.Close();
        newMsg.Position = 0;

        //create the new message        
        XmlReader reader = XmlReader.Create(newMsg);
        newMessage = Message.CreateMessage(reader, int.MaxValue, request.Version);
        request = newMessage;
        return null;
}

В самом конце функции XDocument прежнему имеет действительный XML, но когда я создаю сообщение в конце, это похоже на проблему.

У кого-нибудь есть мысли?

  • 1
    Этот ответ какой-либо пользы?
  • 0
    Ну, это раздражает. Я получал сообщение из журналов WCF, но когда я просматриваю фиддлер в полном сообщении, я вижу правильный XML, т. Е. Не ... поток ... Почему WCF регистрирует таким образом? Какая пустая трата полдня :) Спасибо @barrick за то, что указал мне на эту ссылку, потому что ссылка сказала то же самое, что заставило меня взглянуть на скрипач.
Показать ещё 1 комментарий
Теги:
soap
wcf

1 ответ

0

Похоже, что это именно то, как WCF регистрировал сообщение. Глядя на скрипача, весь xml проходит. Я не понимаю, почему WCF регистрировался таким образом, но что угодно.

FYI для любого другого, кто сталкивается с этим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню