我正在学习 wcf。所以我遇到了一个名为已知类型的 wcf 属性。在这里我得到了一段不清楚的代码。
[DataContract]
public class UserAccount {}
[DataContract]
public class Admin : UserAccount {}
[DataContract]
public class Guest : UserAccount {}
[DataContract]
[ServiceKnownType(typeof(Admin))]
[ServiceKnownType(typeof(Guest))]
public class SecurityInfo
{
[DataMember]
private UserAccount user;
}
现在教程说上面的代码可以正常工作,我们将 SecurityInfo 数据成员设置为 Admin 或 Guest。但是如果没有提供 Admin 和 Guest 的 KnownTypeAttribute,反序列化引擎将无法识别 Admin 和 Guest 类型,并且会报错。
SecurityInfo 与 admin 和 guest 类之间的关系是什么? 我真的不明白已知类型属性在这里做什么。我不熟悉已知的类型属性,也不知道它的作用以及何时使用它。
所以我想请求请让我以这样的方式理解已知的类型属性,这样我就可以理解它的用途和它是什么....所以请提供一个简单的示例代码,我可以在其中理解已知的内容类型属性。谢谢
最佳答案
(这些是对概念的简化解释,而不是 WCF 中的技术实现)。
当通过网络发送消息时,例如使用 WCF,它被序列化。换句话说(大多数时候),在文本中。说XML。客户端发送给服务器的 XML 描述了数据及其结构。
<data>
<SecurityInfo>
<user type="UserAccount">(some further XML data here)</user>
</SecurityInfo>
</data>
收到此代码后,WCF API 会解析 XML 并尝试创建您将能够在代码中操作的 C# 对象。这是 Securityinfo
的一个实例属性类型为 UserAccount
的类.但它如何知道哪个类可以被实例化?
显然是 <user>
节点在其属性中保存类名。但是,如果客户端发送了一个像 Admin
这样的派生实例呢?类(class)?你会收到这样的东西:
<data>
<SecurityInfo>
<user type="Admin">(some further XML data here)</user>
</SecurityInfo>
</data>
[KnownType]
属性通知 WCF 服务“可以”接收此 Admin
类型,因为它是等待的子类 UserAccount
类型。
当 Admin
子类有更多的属性,比如 public string AdminEmail { get;set; }
.此属性也将由客户端发送。 WCF 服务器在执行其服务器端解析作业时,会被告知此附加属性自 Admin
以来有效。类型是有效的 [KnownType]
.
关于c# - 什么是 WCF 中的已知类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22915973/