Pregunta

Tengo una matriz de cadena en DataContract como abajo

[DataMember(Name = "photos", IsRequired = true, Order = 3)] 
public string[] photos { get; set; }

En la llamada de servicio de descanso WCF, estoy pasando por debajo de la entrada XML para esta matriz de cadena

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

Mi código de cliente capaz de realizar llamadas de servicio web con la transacción XML en HTTPWEBREQUEST, sin problemas, desde el servicio, podría ver todos los demás datos que vienen, excepto esta matriz de cadenas.Estoy perdiendo algo en DataContract para serializar matrices.Por favor ayuda

Intentado con colecciónDataControl a continuación, todavía sin suerte

[CollectionDataContract(Name = "photos")]
public class Photos : Collection<string>

También se agregaron plazos profundos que no se requiere para los tipos ordinales

[KnownType(typeof(string[]))]
public class PublishPhotos
{

Aquí hay una clase completa de contrato de datos

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

}

¿Fue útil?

Solución

Finalmente, me di cuenta de lo que salió mal con XML en HTTPWEBREQUEST, el problema es con una matriz de cadena en serie.La forma más fácil que pude haber descubierto a través de visitando /publishersvc.svc/help para cadena. Requiere espacio de nombres >http://schemas.microsoft.com/2003/10/serialization/arrays Como a continuación

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">http://localhost:8081/photos/1/1.jpg</string>

Espero que esto ayude a alguien que enfrenta un problema similar

Otros consejos

He descubierto la respuesta a este problema.Gracias a @ harlanb

He cambiado el contrato de datos de la serialización de DataContract a 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; }

}

En el código del cliente, estoy usando XMlSerializer para escribir en HTTPWEBREQUEST como a continuación

            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();

Espero que esto ayude a otras personas que tengan problemas similares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top