WCF Datacontractserializer不选择合同属性……为什么不呢?
-
16-09-2019 - |
题
我有以下类型在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 得到这项工作?
解决方案
这是因为消息合同不是数据合同,因此数据合同使用不同的属性来标记其类。尝试使用打字消息转换器;
EchoRequest echoRequest = new EchoRequest{ value = "Hello" };
TypedMessageConverter echoMessageConverter = TypedMessageConverter.Create(
typeof(echoRequest),
"YourActionNameHere",
"http://example.com/services");
Message request = echoMessageConverter.ToMessage(
echoRequest,MessageVersion.Soap11);
然后,您将有一条消息准备就绪,并且可以根据需要将请求主体拉出。
不隶属于 StackOverflow