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; }

}

Était-ce utile?

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 à @ harlanb

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top