如何将多维列表或元组传递给C#Web服务

时间:2013-04-03 21:37:06

标签: c# web-services multidimensional-array asmx

我正在开发一个需要接受具有三种不同类型值的集合的Web服务。值是

SkuNumber(整数), FirstName(字符串), LastName(字符串)

我希望Web服务接受这些值的100个实例的列表,但我不确定如何去做。我是否使用多维列表或数组?也许一个元组?或者我可以创建一个简单的类结构并接受该类的列表吗?

这在普通应用程序中非常简单,我只是不确定调用Web服务的应用程序如何使用任何给定选项传递数据。

有人可以给我一些指示吗?

3 个答案:

答案 0 :(得分:2)

创建一个类并接受该类的列表。请务必将其标记为[可序列化]。

[Serializable]   
public class Whatever
{
    public int SkuNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

最佳做法是在程序集中定义类,服务和调用它的项目都可以访问它。

元组或多维数组的问题在于,您发送的数据没有固有的标识:您可以在其中粘贴任何旧的东西。如果您有课程,则表明您正在发送订单或查询或优惠券或您正在跟踪的任何内容。它有一定的含义。

答案 1 :(得分:2)

如果共享程序集不可行,您可以随时使用良好的XML。它可能不是最佳解决方案,我相信这里的大量用户会对这个想法犹豫不决,但它很容易支持并且实施起来相对较快,所以它实际上取决于您的个人情况和负责的开发人员的技能水平用于支持该应用程序。

这里使用XML的好处是,调用应用程序几乎可以在任何平台上用几乎任何语言编写,只要它遵循XML结构即可。

XML字符串应该很容易在调用应用程序中生成,但最大的缺点是,如果您有大量数据,则处理可能需要比预期更长的时间 - 在服务的两端。

如果你想尝试一下,这是一个工作样本:

 public class Whatever
    {
        public int SkuNumber { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    [WebMethod]
    public void HelloWorld(string xmlString)
    {
        //make all the node names + attribute names lowercase, to account for erroneous xml formatting -- leave the values alone though
        xmlString = Regex.Replace(xmlString, @"<[^<>]+>", m => m.Value.ToLower(),RegexOptions.Multiline | RegexOptions.Singleline);

        var xmlDoc = LoadXmlDocument(xmlString);


        var listOfStuff = new List<Whatever>();

        var rootNode = xmlDoc.DocumentElement;
        foreach(XmlNode xmlNode in rootNode)
        {
            var whatever = new Whatever
                               {
                                   FirstName = xmlNode["first_name"].InnerText,
                                   LastName = xmlNode["last_name"].InnerText,
                                   SkuNumber = Convert.ToInt32(xmlNode["sku_number"].InnerText)
                               };
            listOfStuff.Add(whatever);
        }
    }

    public static XmlDocument LoadXmlDocument(string xmlString)
    {
        //some extra stuff to account for URLEncoded strings, if necessary
        if (xmlString.IndexOf("%3e%") > -1)
            xmlString = HttpUtility.UrlDecode(xmlString);

        xmlString = xmlString.Replace((char)34, '\'').Replace("&", "&amp;").Replace("\\", "");

        var xmlDocument = new XmlDocument();
        xmlDocument.PreserveWhitespace = false;
        xmlDocument.LoadXml(xmlString);

        return xmlDocument;
    }

你的XML看起来像这样:

<stuff_to_track>
<whatever>
    <sku_number>1</sku_number>
    <first_name>jimi</first_name>
    <last_name>hendrix</last_name>
</whatever>
<whatever>
    <sku_number>2</sku_number>
    <first_name>miles</first_name>
    <last_name>davis</last_name>
</whatever>
<whatever>
    <sku_number>3</sku_number>
    <first_name>david</first_name>
    <last_name>sanborn</last_name>
</whatever>
<whatever>
    <sku_number>4</sku_number>
    <first_name>john</first_name>
    <last_name>coltrane</last_name>
</whatever>
</stuff_to_track>

我还建议为架构和数据验证传入的XML。

答案 2 :(得分:0)

只需发送您想要的内容:

public class Whatever
{
    public int SkuNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

[WebMethod]
public void TakeList(List<Whatever> theList)
{
    foreach (var w in theList)
    {
    }
}