我有这个类,它是我的WCF服务的输入:
[DataContract]
public class LoginDTO
{
[DataMember]
public string Username { get; set; }
[DataMember]
public string Password { get; set; }
}
这是我的服务接口(IUserServices)中的方法:
[OperationContract]
[FaultContract(typeof(ServiceException))]
[ServiceKnownType(typeof(LoginDTO))]
[WebInvoke(UriTemplate = "/login/", Method = "POST")]
UserDTO LogIn(LoginDTO loginInfo);
测试我的服务(使用Postman)会导致此错误:
System.Runtime.Serialization.SerializationException:无法执行 使用根名称“LoginDTO”和根名称空间''反序列化XML主体 (用于操作'LogIn'和合同('IUserServices', 'http://tempuri.org/'))使用DataContractSerializer。确保 对应于XML的类型被添加到已知类型集合中 服务。
我发布了这个:(Content-Type => application / xml)
<LoginDTO>
<Username>MyUsername</Username>
<Password>MyPassword</Password>
</LoginDTO>
我错过了什么,或者我做错了什么?
更新
我在下面将@ knyu的回复标记为答案,因为它解决了我当前的问题。但是,我决定为我的类型使用(适当的)命名空间,所以我在包含我的DTO的程序集中添加了ContractNamespace属性。这意味着我的输入XML需要指定此命名空间才能正确反序列化。
答案 0 :(得分:0)
如果您不需要为实体使用名称空间,只需将DataContract的Namespace属性设置为空字符串(&#34;&#34;),这应解决此问题:
[DataContract(Namespace = "")]
public class LoginDTO
{
[DataMember]
public string Username { get; set; }
[DataMember]
public string Password { get; set; }
}
更新:我绝对同意@Frank Fajardo和@Khurram Ali,使用合适的命名空间要好得多。但我实际上并不了解服务的用例场景,并且可能存在需要支持某些旧版客户端或任何其他特殊要求的场景。无论如何,我希望我的答案可以帮助你选择正确的方向。