发送到Web服务的对象包含“null”属性

时间:2009-08-12 09:00:22

标签: c# web-services asmx

可以将一个类的实例发送到web服务器上的webmethod不是它。 (该类实际上是在Web服务器上创建的。)

我问,因为我有一个填充的类实例,我正在尝试将其发送回网络服务器,但是当实例到达web方法时,它已被清空(已创建一个新的实例)??

可能有助于解释的一些代码:

    private void miIssue_Click(object sender, EventArgs e)
    {
        string r = sC.updatePickItem(batch, deptID, issued, pL);
    }

   //The creation of the webserver class I want to pass
    [Serializable]
    public class PickingList
    {
        List<PickingDetails> pD = new List<PickingDetails>();

        public bool found { get; set; }
        public PickingDetails[] pickingDetail
        {
            get { return pD.ToArray(); }
            set { }
        }

        public void addPickingDetail(PickingDetails pI)
        {
            pD.Add(pI);
        }
    }

    [Serializable]
    public class PickingDetails
    {
        public string warehouse { get; set; }
        public string stockCode { get; set; }
    }

    //The webmethod I'm connecting to
    [WebMethod]
    public string updatePickItem(string batch, string deptID, bool issued, PickingList pL )
    {
        try
        {
            if (!issued)
                issued = issueStockToWIP(rows, batch, deptID, pL);
        }
        catch (Exception e)
        { return e.ToString(); }
    }

2 个答案:

答案 0 :(得分:3)

如果您使用[WebMethod],则通常会在幕后使用XmlSerializer。看起来最大的问题是set上的空pickingDetail。由于XmlSerializer要求列表/数组上有set,我可能会保持简单并使用:

[XmlElement("pickingDetail")
public List<PickingDetails> Details {get;set;}        

(也许可以在无参数ctor中初始化它以简化使用)

public PickingList() {
    Details = new List<PickingDetails>();
}

有关信息,我倾向于在C#中使用.NET命名约定,在xml中使用xml约定 - 例如:

[XmlElement("found")] // or XmlAttribute
public bool Found { get; set; }

对于信息,DataContractSerializer(默认情况下在WCF服务中使用)对setter没有这种恼人的需求。你也可以切换到WCF ...

答案 1 :(得分:2)

您需要为pickingDetail提供一个setter,否则如果反序列化该类将如何填充?

尝试

set {
  pD.Clear();
  foreach (PickingDetails p in value)
    addPickingDetail(p); 
}