¿Cómo definir matrices de cadena en el contrato de datos?
-
22-12-2019 - |
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; }
}
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.