gpt4 book ai didi

WCF DataContractSerializer 不选择契约(Contract)属性......为什么不呢?

转载 作者:行者123 更新时间:2023-12-03 21:56:02 24 4
gpt4 key购买 nike

我有以下类型,我在 WCF 中用作消息契约(Contract):

[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 命名空间根据消息契约(Contract)属性正确。

当我使用 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);

然后,您将准备好一条消息,并且可以在需要时拉出请求正文。

关于WCF DataContractSerializer 不选择契约(Contract)属性......为什么不呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1135309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com