【问题标题】:Can't deserialize XML in WCF REST service无法在 WCF REST 服务中反序列化 XML
【发布时间】:2009-06-08 20:47:48
【问题描述】:

我刚刚开始使用 REST 入门工具包,但在尝试构建自己的服务时遇到了障碍。我正在尝试创建用于帐户管理的服务,但无法让该服务序列化我的对象,引发以下错误:

无法使用 DataContractSerializer 反序列化具有根名称“CreateAccount”和根命名空间“”的 XML 正文(用于操作“CreateAccount”和合同(“Service”、“http://tempuri.org/”))。确保将 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; }
}

我错过了什么愚蠢的东西吗?

提前致谢!

【问题讨论】:

    标签: c# xml wcf rest xml-serialization


    【解决方案1】:

    事实证明,我在业务对象的 [DataContract] 属性中遗漏了一个额外的值。

    应该是[DataContract(Namespace = "")]

    【讨论】:

      【解决方案2】:

      问题似乎是您的方法名称“CreateAccount”和您的输入类型“CreateAccount”之间的命名空间冲突。

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

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

      如果要保持同名,可以为 CreateAccount 类指定命名空间。

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

      ResponseFormat = WebMessageFormat.Xml
      

      【讨论】:

      • 我只是想到了可能与对象和方法的命名冲突。我已将对象名称更改为“CreateAccountRequest”,并添加了 [DataContract] 和 [DataMember] 属性,但没有运气。
      • 见上面的编辑。确保您也在服务合同中指定属性。你应该有一个服务接口。这就是 OperationContract 和 WebInvoke 属性应该存在的地方。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题,但我确实有 DataContract 属性。在尝试将 xml 读回对象时,我缺少的是根元素中的 xmlns="http://uri.org" 属性。
        例如

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

        【讨论】:

          猜你喜欢
          • 2023-03-11
          • 2021-01-26
          • 2019-01-04
          • 1970-01-01
          • 2012-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多