0

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

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

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

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

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

4

3 回答 3

2

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

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

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

元组或多维数组的问题在于您发送的数据没有固有的身份:您可以将任何旧的东西放在那里。如果您有课程,则表明您正在发送订单或查询或优惠券或您正在跟踪的任何内容。有一个层次的意义随之而来。

于 2013-04-03T21:41:00.177 回答
2

如果共享程序集不可行,您总是可以使用好的 ol' 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,包括模式和数据。

于 2013-04-03T22:38:28.650 回答
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)
    {
    }
}
于 2013-04-04T02:53:45.820 回答