Comment définir des tableaux de chaîne dans le contrat de données?
-
22-12-2019 - |
Question
J'ai un tableau de chaîne dans Datacontract comme ci-dessous
[DataMember(Name = "photos", IsRequired = true, Order = 3)]
public string[] photos { get; set; }
Dans l'appel du service de repos de WCF, je passe en dessous de l'entrée XML pour cette matrice de chaîne
<photos>
<string>http://localhost:13169/MainPortal/ContentLibrary/21/58/1227132014-bmw-x1_100426158_m.jpg</string>
<string>http://localhost:13169/MainPortal/ContentLibrary/21/58/122713bmw2.jpg</string>
<string>http://localhost:13169/MainPortal/ContentLibrary/21/58/122713bmw3.jpg</string>
<string>http://localhost:13169/MainPortal/ContentLibrary/21/58/122713BMW_Hamann_Laguna_Seca.jpg</string><string>http://localhost:13169/MainPortal/ContentLibrary/21/58/1227132014-BMW-X1-SUV-sDrive-28i-4dr-4x2-Sports-Activity-Vehicle-Exterior-2.png</string>
</photos>
Mon code client capable de faire appel à Webservice en passant XML dans httpwebrequest sans aucun problème, du service, je pouvais voir toutes les autres données à l'exception de cette matrice de chaîne.Est-ce que je manque quelque chose dans DataContract pour sérialiser des tableaux.S'il vous plaît aider
essayé avec CollectionDatacontract comme ci-dessous toujours pas de chance
[CollectionDataContract(Name = "photos")]
public class Photos : Collection<string>
a également ajouté des types connus qui ne sont toutefois pas nécessaires pour les types ordinaux
[KnownType(typeof(string[]))]
public class PublishPhotos
{
Voici la classe de contrat de données complète
[DataContract(Namespace = "http://myurl.com/Publisher")]
[KnownType(typeof(string[]))]
public class PublishPhotos
{
[DataMember(Name = "publicationId", IsRequired = true, Order = 0)]
public int publicationId { get; set; }
[DataMember(Name = "issueId", IsRequired = true, Order = 1)]
public string issueId { get; set; }
[DataMember(Name = "contentId", IsRequired = true, Order = 2)]
public string contentId { get; set; }
[DataMember(Name = "photos", IsRequired = true, Order = 3)]
public Photos photos { get; set; }
}
La solution
Enfin, j'ai compris ce qui s'est mal passé avec XML dans httpwebrequest, le problème est avec une matrice Serializing String.Le moyen le plus simple que j'aurais pu comprendre en visitant /publishersvc.svc/help pour la chaîne, il nécessite des espaces de noms d'espace http://schemas.microsoft.com/2003/10/serialization/arrays comme en dessous
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">http://localhost:8081/photos/1/1.jpg</string>
J'espère que cela aide quelqu'un à faire face à un numéro similaire
Autres conseils
J'ai compris la réponse à ce problème.Merci à
J'ai modifié le contrat de données de DataContract Serialization à XMLSerialization
[SerializableAttribute()]
[XmlTypeAttribute(AnonymousType = true)]
[XmlRootAttribute(Namespace = "http://myUrl.com/Publisher", IsNullable = false)]
public class PublishPhotos
{
//[DataMember(Name = "publicationId", IsRequired = true, Order = 0)]
[XmlElementAttribute(ElementName="publicationId", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
public int publicationId { get; set; }
//[DataMember(Name = "issueId", IsRequired = true, Order = 1)]
[XmlElementAttribute(ElementName = "issueId", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 1)]
public string issueId { get; set; }
//[DataMember(Name = "contentId", IsRequired = true, Order = 2)]
[XmlElementAttribute(ElementName = "contentId", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 2)]
public string contentId { get; set; }
//[DataMember(Name = "photos", IsRequired = true, Order = 3)]
[XmlElementAttribute(ElementName = "photos", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 3)]
public string[] photos { get; set; }
}
Dans le code du client, j'utilise XMLSerializer pour écrire sur httpwebrequest comme ci-dessous
pubPhotos.publicationId = Convert.ToInt32(publication.Value);
pubPhotos.issueId = secName;
pubPhotos.contentId = selectedMediaItem;
HtmlDocument divDoc = new HtmlDocument();
divDoc.LoadHtml(widgetScript);
HtmlNode divNode = divDoc.DocumentNode.FirstChild;
HtmlNodeCollection imgs = divNode.SelectNodes("//img");
Collection<string> photos = new Collection<string>();
foreach (HtmlNode img in imgs)
{
photos.Add(img.Attributes["src"].Value);
}
pubPhotos.photos = photos.ToArray();
HttpWebRequest req = null;
const string url = "http://localhost:40009/PublisherSvc.svc/PublishPhotos";
req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/xml; charset=utf-8";
req.KeepAlive = false;
req.Timeout = 30000;
req.Headers.Add("SOAPAction", url);
XmlSerializer serilizer = new XmlSerializer(typeof(PublishPhotos));
var sw = new StreamWriter(req.GetRequestStream());
serilizer.Serialize(sw, pubPhotos);
sw.Close();
J'espère que cela aide d'autres personnes là-bas qui ont des problèmes similaires.