WCF的DataContractSerializer不拾取合同属性... ...为什么不呢?(WCF

2019-07-30 07:13发布

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

Answer 1:

这是因为消息合同不是数据协定,数据协定使用不同的属性来纪念他们的班。 尝试使用类型的消息变换;

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 doesn't pick up contract attributes… why not?