Если совместная сборка невозможна, вы всегда можете использовать хороший 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, как для схемы и данные.
FWIW, я вообще избегать собственных многомерных массивов, как чума: они несколько неэффективны, имеют плохую совместимость с новыми конструкциями, как LINQ и сериализация, и обычно вызывает головные боли. – JerKimball
Является ли это службой WCF или устаревшим сервисом ASMX? –
Это устаревшая служба ASMX. Он будет вызываться из приложения терминала терминала POS типа Java. Услуга может быть написана в WCF, что является лучшим подходом. – user2167861