【问题标题】:How can I convert an XML file to an instance of a MessageContract class?如何将 XML 文件转换为 MessageContract 类的实例?
【发布时间】:2011-04-19 10:38:45
【问题描述】:

我正在尝试针对现有的示例消息测试 [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] 类的实例,但它是什么?

【问题讨论】:

    标签: c# wcf messagecontract


    【解决方案1】:

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

    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;
        }
    }
    

    【讨论】:

    • 显然您通常需要一个操作和正确的消息版本,但这就是我知道如何做到这一点的方式。最后,您将得到一个示例对象您可以使用 ToMessage 将 TypedMessageConverter 转换为字符串表示形式来做类似的事情
    【解决方案2】:

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

    Here is a quick tutorial 将向您展示如何为您的 XML 手动调用 DataContractSerializer

    【讨论】:

    • 呃,这里没有[DataContract]。这是一个[MessageContract],具有[MessageHeader][MessageBodyMember] 属性。
    • 另外,XML 文件不仅仅是肥皂消息的正文部分,它还是整个完整的信封。
    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多