我有以下类型,我在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工具得到这个工作?