Как я могу преобразовать файл XML в экземпляр класса MessageContract? - PullRequest
4 голосов
/ 30 сентября 2010

Я пытаюсь протестировать класс [MessageContract] с существующим примером сообщения, и я ищу способ упростить разработку, прочитав файл примера сообщения в экземпляр моего класса [MessageContract] и выяснив, как онсработал (здесь я имею дело с особенно сложным контрактом, не относящимся к WCF).

Мой [MessageContract] класс выглядит примерно так:

[MessageContract(IsWrapped = true, WrapperName = "wrapper", WrapperNamespace = "somens")]
public class RequestMessage
{
    [MessageHeader(Name = "HeaderElem", Namespace = "otherns")]
    public XElement CorrelationTimeToLive { get; set; }

    [MessageBodyMember(Name = "id", Namespace = "somens")]
    public XElement id { get; set; }
}

Я могу прочитатьфайл в экземпляр класса Message, используя следующий код:

var xr = XmlReader.Create("sample_message.xml");
var msg = Message.CreateMessage(xr, int.MaxValue, MessageVersion.Soap12);

Однако это не особенно полезно, потому что не позволяет мне тестировать мой класс [MessageContract].

Где-то в недрах WCF есть система для превращения этого экземпляра Message в экземпляр определенного класса [MessageContract], но что это такое?

Ответы [ 2 ]

5 голосов
/ 10 ноября 2010

Я только что узнал, как это сделать, на днях после разговора с коллегой. Я думаю, это то, что вы просили сделать.

namespace MessageContractTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string action = null;
            XmlReader bodyReader = XmlReader.Create(new StringReader("<Example xmlns=\"http://tempuri.org/\"><Gold>109</Gold><Message>StackOverflow</Message></Example>"));
            Message msg = Message.CreateMessage(MessageVersion.Default, action, bodyReader);
            TypedMessageConverter converter = TypedMessageConverter.Create(typeof(Example), "http://tempuri.org/IFoo/BarOperation");
            Example example = (Example)converter.FromMessage(msg);
        }
    }


    [MessageContract]
    public class Example
    {
        [MessageHeader]
        public string Hello;

        [MessageHeader]
        public double Value;

        [MessageBodyMember]
        public int Gold;

        [MessageBodyMember]
        public string Message;
    }
}
0 голосов
/ 30 сентября 2010

Вам нужно будет десериализовать XML в экземпляр вашего контракта на данные. Это то, что WCF делает для вас под одеялом.

Вот краткое руководство , которое покажет вам, как вызвать DataContractSerializer вручную для вашего XML.

...