Wcf 服务(已启用 ajax)传递的 XML 子对象始终为空

本文关键字:对象 XML 服务 启用 ajax Wcf | 更新日期: 2023-09-27 17:56:19

我有一个WCF(启用ajax)的Web服务,并具有以下方法,它接受一个名为TypeRequest的对象。

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/XML/GetTypes", 
BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml)]
XElement XMLGetTypes(TypeRequest obj) 
{  
  //do something 
}

类型请求对象定义为;

[DataContract(Namespace = "")]
public class TypeRequest 
{
    [Required]
    [DataMember]
    public long Id{ get; set; }
    [Required]
    [DataMember]
    public Account Account { get; set; }
}

那么我的子账户类如下;

[DataContract(Namespace = "")]
public class Account
{
    /// <summary>
    /// Email address
    /// </summary>
    [DataMember]
    [Required]
    [StringLength(175)]        
    public string Email { get; set; }
    /// <summary>
    /// Plain text password
    /// </summary>
    [DataMember]
    [Required]
    [StringLength(16, MinimumLength = 8)]
    public string Password { get; set; }
}

我遇到的问题是,如果我通过以下示例 Xml 进行调用

<TypeRequest>
<Id>1</Id>
<Account>
<Email>myemail@domain.com</Email>
<Password>12345</Password>
</Account>
</TypeRequest>

到方法XMLGetTypes(TypeRequest obj),我可以查看obj和Id具有正确的值,但帐户对象为空

为什么会这样,我做错了什么,因为我似乎想不通。 我是否需要提供更多信息才能获得帮助?

除了我之前的信息之外,我还添加了一种接受 JSON 请求的方法,例如

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/JSON/GetTypes", 
BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
string JSONGetTypes(TypeRequest obj) 
{  
  //do something 
}

使用 JSON 调用此函数作为

{
  "TypeRequest": {
    "Id": "1",
    "Account": {
      "Email": "myemail@domain.com",
      "Password": "12345"
    }
  }
}

我可以查看 TypeRequest obj,并且可以查看发布的所有正确数据。 因此,为什么 Xml 帖子不起作用?!?

Wcf 服务(已启用 ajax)传递的 XML 子对象始终为空

尝试将 xml 更改为此?

<TypeRequest>
  <Id>1</Id>
  <Account>
    <Email>myemail@domain.com</Email>
    <Password>12345</Password>
</TypeRequest>

添加

[XmlSerializerFormat] 到我的方法解决了这个问题。 例如

[OperationContract]
[XmlSerializerFormat]
[WebInvoke(Method = "POST", UriTemplate = "/XML/GetTypes", 
BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml)]
XElement XMLGetTypes(TypeRequest obj) 
{  
  //do something 
}