2010-09-30 37 views
4

我试图根据现有的示例消息测试[MessageContract]类,并且正在寻找一种方法来简化开发,方法是将示例消息文件读入我的[MessageContract]类的实例中,并查看它是如何实现的(I'在这里处理一个非WCF起源的特别复杂的合同)。如何将XML文件转换为MessageContract类的实例?

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

回答

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

显然你需要一个动作和正确的消息版本,但这是我知道如何做到这一点。最后你会得到一个Example对象你可以用TypedMessageConverter做类似的事情,通过使用ToMessage转换为一个字符串表示 – 2010-11-10 00:30:24

-1

您需要将XML反序列化为数据合约的实例。这就是WCF在封面上为你做的。

Here is a quick tutorial这将告诉你如何为你的XML手动调用DataContractSerializer

+1

呃,这里没有'[DataContract]'。这是一个'[MessageContract]',其中包含'[MessageHeader]'和'[MessageBodyMember]'属性。 – Mark 2010-09-30 16:01:13

+0

此外,XML文件不仅仅是肥皂消息的正文部分,它是整个完整的信封。 – Mark 2010-09-30 16:03:35