sas*_*alm 2 c# xml datacontractserializer asp.net-web-api
我有一个问题,就是我的对象没有从Post请求的主体中反序列化,我遵循了这个答案,因为在WebApi中默认使用DataContractSerializer,因此您需要以xmlns这种方式定义
<TestModel
xmlns="http://schemas.datacontract.org/2004/07/YourMvcApp.YourNameSpace">
Run Code Online (Sandbox Code Playgroud)
确实可以,但是如果我更改年份或月份(如)http://schemas.datacontract.org/2005/07/...,它就会停止工作,并且我的对象再次变为null。
为什么会这样,http://schemas.datacontract.org/2004/07/以某种方式进行硬编码?为何要使用此网址?
每个数据合同对象均由完全限定的数据合同名称标识。如数据合同名称中所述:
有关命名数据合同的基本规则包括:
- 完全限定的数据协定名称由名称空间和名称组成。
- 数据成员只有名称,没有名称空间。
- 处理数据协定时,WCF基础结构对名称空间以及数据协定和数据成员的名称都区分大小写。
数据协定名称空间采用统一资源标识符(URI)的形式。URI可以是绝对的,也可以是相对的。默认情况下,为特定类型的数据协定分配一个命名空间,该命名空间来自该类型的公共语言运行库(CLR)命名空间。
默认情况下,任何给定的CLR名称空间(格式为Clr.Namespace)都映射到名称空间“ http://schemas.datacontract.org/2004/07/Clr.Namespace ”。要覆盖此默认值,请将
ContractNamespaceAttribute属性应用于整个模块或程序集。或者,要控制每种类型的数据协定名称空间,请设置的Namespace属性DataContractAttribute。
在数据合同等效中:
为了使数据合同等效,它们必须具有相同的名称空间和名称。此外,一侧的每个数据成员必须在另一侧具有等效的数据成员。
因此,要成功地通过网络发送数据合同对象,标准的数据合同名称必须在两端都匹配。如上所述,默认的数据协定名称空间是http://schemas.datacontract.org/2004/07/Clr.Namespace,但是您可能需要更改此名称以反映您的组织,例如:
[DataContract(Namespace = "http://schemas.MyOrganization.com/v1")]
public class TestModel
{
[DataMember]
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以为整个程序集和.Net命名空间设置它:
[assembly: ContractNamespace("http://schemas.MyOrganization.com/v1", ClrNamespace = "YourMvcApp.YourNameSpace")]
Run Code Online (Sandbox Code Playgroud)
数据协定序列化可用于JSON和XML,那么如何DataContractSerializer将数据协定名称从XML映射到XML?它使用XML元素本地名称和名称空间URI来做到这一点:
<TestModel xmlns="http://schemas.datacontract.org/2004/07/YourMvcApp.YourNameSpace">
Run Code Online (Sandbox Code Playgroud)
该xmlns="http://schemas.datacontract.org/2004/07/YourMvcApp.YourNameSpace"属性是具有本地名称的元素的默认XML名称空间声明TestModel。本地名称和名称空间共同构成了元素的扩展名称。如果名称空间URI和本地名称匹配,则XML元素名称被认为是相等的,因此Microsoft选择将数据协定名称与XML元素本地名称相对应,并将数据协定名称空间与XML名称空间URI相对应,这就是为什么更改偶数形式的原因。年或月 URI中的会导致反序列化失败。
因此,您可以看到,在推出数据协定Web API或WCF服务之前,必须先解决名称空间的选择,因为更改名称空间需要在客户端更新名称空间。(当然,对于WCF,客户端通常会从架构元数据自动生成客户端,如在此处或此处所述)。
| 归档时间: |
|
| 查看次数: |
2543 次 |
| 最近记录: |