我正在开发一个web服务,该服务需要接受具有三个不同类型值的集合。取值为
SkuNumber(整数),FirstName(字符串),姓(字符串)
我希望web服务接受这些值的100个实例的列表,但我不确定如何去做。是使用多维列表还是数组?也许是元组?或者我可以创建一个简单的类结构并接受该类的列表?
这在正常的应用程序中都很简单,我只是不确定调用web服务的应用程序如何通过任何给定的选项传递数据。
谁能给我点建议吗?如果共享程序集不可用,您总是可以使用良好的老式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("&", "&").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,包括模式和数据。
创建一个类并接受该类的列表。请务必将其标记为[Serializable]。
[Serializable]
public class Whatever
{
public int SkuNumber { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
最佳实践是在程序集中定义类,使服务和调用它的项目都可以访问该类。
元组或多维数组的问题是,你发送的数据没有固有的身份:你可以把任何旧的东西放在那里。如果你有一个类,你表明你正在发送订单或查询或优惠券或任何你正在跟踪的东西。它有一定程度的意义。
发送你想要的:
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)
{
}
}