无法将XML帖子反序列化为WCF服务。我错过了什么?

时间:2015-01-31 05:20:48

标签: c# .net xml wcf xml-deserialization

我有这个类,它是我的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需要指定此命名空间才能正确反序列化。

1 个答案:

答案 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,使用合适的命名空间要好得多。但我实际上并不了解服务的用例场景,并且可能存在需要支持某些旧版客户端或任何其他特殊要求的场景。无论如何,我希望我的答案可以帮助你选择正确的方向。