WCF REST服务 - DataContract会停止构造函数吗?

Jez*_*Jez 5 .net c# xml serialization

我的WCF REST服务发生了一个奇怪的问题.对于接受数据的操作,假设它接受Foo类:

[WebInvoke(Method = "PUT", UriTemplate = "users/{username}")]
[OperationContract]
public void UpdateLoginUser(string username, LoginUser userUpdated) {
[...]
}
Run Code Online (Sandbox Code Playgroud)

现在我的LoginUser类继承自我的NormalUser类:

<DataContract()> _
Public MustInherit Class NormalUser
[...]
End Class

Public Class LoginUser
 Inherits NormalUser
[...]
End Class
Run Code Online (Sandbox Code Playgroud)

当我PUT到我的服务,触发UpdateLoginUser时,一切正常.但是,如果我将DataContract应用于我的NormalUser类:

<DataContract()> _
Public Class LoginUser
 Inherits NormalUser
[...]
End Class
Run Code Online (Sandbox Code Playgroud)

...突然,在反序列化过程中,LoginUser类的构造函数不会触发!我有需要运行的业务登录规则.那么,为什么当我将DataContract属性应用于我继承的类时,它的构造函数会停止被触发?我怎么能绕过这个?如果我想更改名称空间或名称,我需要应用DataContract属性.

And*_*are 7

DataContractSerializer不会调用合约的构造函数.如果你想在反序列化时运行一个方法,请用OnDeserializingattrbute 装饰它:

应用于方法时,指定在对象的反序列化期间调用该方法.

您的另一个选择是与WCF一起使用XmlSerializer:

WCF还支持XmlSerializer类.XmlSerializer类不是WCF唯一的.它与ASP.NET Web服务使用的序列化引擎相同.XmlSerializer类支持比DataContractSerializer类更窄的类型集,但允许对结果XML进行更多控制,并支持更多XML Schema定义语言(XSD)标准.它也不需要可序列化类型的任何声明性属性.有关更多信息,请参阅.NET Framework文档中的XML序列化主题.XmlSerializer类不支持数据协定类型.