我正在尝试针对现有示例消息测试[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]
类的实例,但它是什么?
答案 0 :(得分: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;
}
}
答案 1 :(得分:-1)
您需要将XML反序列化为数据协定的实例。这就是WCF在幕后为您做的事情。
Here is a quick tutorial将向您展示如何为您的XML手动调用DataContractSerializer
。