无法在WCF REST服务中反序列化XML

时间:2009-06-08 20:47:48

标签: c# xml wcf rest xml-serialization

我刚刚开始使用REST入门套件,我试图建立自己的服务。我正在尝试创建一个帐户管理服务,我无法获得序列化我的对象的服务,抛出以下错误:

  

无法使用根名称'CreateAccount'和根命名空间''(对于操作'CreateAccount'和契约('Service','http://tempuri.org/'))使用DataContractSerializer反序列化XML主体。确保将与XML对应的类型添加到服务的已知类型集合中。

这是服务的实际代码(基于项目附带的'DoWork'方法):

[WebHelp(Comment = "Creates a Membership account")]
[WebInvoke(UriTemplate = "CreateAccount", RequestFormat = WebMessageFormat.Xml)]
[OperationContract]
public ServiceResponse CreateAccount(CreateAccount request)
{
    try
    {
        // do stuff

        return new ServiceResponse()
        {
            Status = "SUCCESS",
            ErrorMessage = ""
        };
    }
    catch (Exception ex)
    {
        return new ServiceResponse()
        {
             Status = "ERROR",
             ErrorMessage = ex.Message + "\n\n" + ex.StackTrace
        };
    }
}

最后,但并非最不重要的是,这是造成所有麻烦的对象:

public class CreateAccount
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public bool SignUpForNewsletter { get; set; }
    public string Password { get; set; }
}

我错过了任何愚蠢的事吗?

提前致谢!

4 个答案:

答案 0 :(得分:8)

事实证明,我在业务对象的[DataContract]属性中缺少额外的值。

应为[DataContract(Namespace = "")]

答案 1 :(得分:4)

问题是您的方法名称“CreateAccount”与输入类型“CreateAccount”之间存在命名空间冲突。

此外,您必须将CreateAccount类型标记为DataContract,如下所示:

[DataContract]
public CreateAccount
{
    [DataMember]
    public string LastName { get; set; }

    ...
}

如果要保留相同的名称,可以为CreateAccount类指定命名空间。

我注意到你也有一个返回类型。确保返回类型也标记为DataContract属性。另外,请指定返回格式,如下所示:

ResponseFormat = WebMessageFormat.Xml

答案 2 :(得分:1)

如果您还没有,我认为您的CreatAccount类上方的[DataContract]属性。

答案 3 :(得分:0)

我有类似的问题,但我确实有DataContract属性。我尝试将xml读回对象时,根据元素的xmlns =“http://uri.org”属性丢失了。
例如

<Root_Element xmlns="http://uri.org"><Child_Element/>...</Root_Element>