4

我正在尝试[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]类的实例的系统,但它是什么?

4

2 回答 2

5

前几天与同事交谈后,我刚刚学会了如何做到这一点。我想这就是你要求做的。

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;
    }
}
于 2010-11-10T00:27:46.467 回答
-2

您需要将 XML 反序列化为数据协定的实例。这就是 WCF 在幕后为您做的事情。

这是一个快速教程,它将向您展示如何DataContractSerializer为您的 XML 手动调用。

于 2010-09-30T15:54:16.610 回答