【发布时间】:2009-07-16 03:55:30
【问题描述】:
我有以下类型,我在 WCF 中用作消息协定:
[MessageContract(IsWrapped = true,
WrapperNamespace = "http://example.com/services",
WrapperName = "EchoRequest")]
public class EchoRequest
{
public EchoRequest() { }
public EchoRequest(String value)
{
Value = value;
}
[MessageBodyMember(Name = "Value",
Namespace = "http://example.com/services",
Order = 0)]
public String Value { get; set; }
}
当我使用 svcutil.exe 生成此类型的代理时,我得到了一个客户端,该客户端能够与托管它的服务进行通信,元素上的 XML 命名空间根据消息契约属性。
当我在它的一个实例上使用Message.CreateMessage(...) 时,命名空间恢复为默认值 (http://schemas.datacontract.org/2004/07/...)。当我使用DataContractSerializer 的实例时,也会发生同样的事情。我尝试将命名空间传递给DataContractSerializer 构造函数,并且只有包装器包含在命名空间中:
var requestMessage = new EchoRequest("hello, world!");
var serializer = new DataContractSerializer(typeof(EchoRequest),
"EchoRequest",
"http://example.com/services");
var stream = new MemoryStream();
serializer.WriteObject(stream, requestMessage);
var data = Encoding.UTF8.GetString(stream.ToArray());
此时,“数据”为:
<EchoRequest xmlns="http://example.com/services"
xmlns:a="http://schemas.datacontract.org/2004/07/TestClient"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Value>hello, world!</a:Value>
</EchoRequest>
为什么DataContractSerializer 似乎忽略了MessageContract 属性? svcutil 是如何完成这项工作的?
【问题讨论】:
-
感谢您提出这个问题!我刚刚遇到了这个确切的问题,几乎立刻就找到了你的问题。
标签: wcf datacontractserializer datacontract messagecontract