无法将 XML post 反序列化为 WCF 服务。我错过了什么?
Unable to deserialize XML post to WCF service. What am I missing?
我有这个 class 这是我的 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: Unable to
deserialize XML body with root name 'LoginDTO' and root namespace ''
(for operation 'LogIn' and contract ('IUserServices',
'http://tempuri.org/')) using DataContractSerializer. Ensure that the
type corresponding to the XML is added to the known types collection
of the service.
而我 post 这个:(Content-Type => application/xml)
<LoginDTO>
<Username>MyUsername</Username>
<Password>MyPassword</Password>
</LoginDTO>
我错过了什么,或者我做错了什么?
更新
我将下面@knyu 的回复标记为答案,因为它解决了我的直接问题。但是,我决定为我的类型使用(适当的)命名空间,因此我在包含我的 DTO 的程序集中添加了 ContractNamespace 属性。这意味着我的输入 XML 将需要指定此命名空间才能正确反序列化。
如果您不需要为实体使用命名空间,只需将 DataContract 的命名空间 属性 设置为空字符串 (""),这应该可以解决此问题:
[DataContract(Namespace = "")]
public class LoginDTO
{
[DataMember]
public string Username { get; set; }
[DataMember]
public string Password { get; set; }
}
更新: 我完全同意@Frank Fajardo 和@Khurram Ali 的观点,使用适当的命名空间会更好。但我实际上并不知道服务的用例场景,并且可能存在您需要支持某些遗留客户端或任何其他特殊要求的场景。不管怎样,希望我的回答能帮助你选择一个正确的方向。
我有这个 class 这是我的 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: Unable to deserialize XML body with root name 'LoginDTO' and root namespace '' (for operation 'LogIn' and contract ('IUserServices', 'http://tempuri.org/')) using DataContractSerializer. Ensure that the type corresponding to the XML is added to the known types collection of the service.
而我 post 这个:(Content-Type => application/xml)
<LoginDTO>
<Username>MyUsername</Username>
<Password>MyPassword</Password>
</LoginDTO>
我错过了什么,或者我做错了什么?
更新
我将下面@knyu 的回复标记为答案,因为它解决了我的直接问题。但是,我决定为我的类型使用(适当的)命名空间,因此我在包含我的 DTO 的程序集中添加了 ContractNamespace 属性。这意味着我的输入 XML 将需要指定此命名空间才能正确反序列化。
如果您不需要为实体使用命名空间,只需将 DataContract 的命名空间 属性 设置为空字符串 (""),这应该可以解决此问题:
[DataContract(Namespace = "")]
public class LoginDTO
{
[DataMember]
public string Username { get; set; }
[DataMember]
public string Password { get; set; }
}
更新: 我完全同意@Frank Fajardo 和@Khurram Ali 的观点,使用适当的命名空间会更好。但我实际上并不知道服务的用例场景,并且可能存在您需要支持某些遗留客户端或任何其他特殊要求的场景。不管怎样,希望我的回答能帮助你选择一个正确的方向。