データ契約で文字列配列を定義する方法
-
22-12-2019 - |
質問
私はDataContractに文字列配列を下回る
[DataMember(Name = "photos", IsRequired = true, Order = 3)]
public string[] photos { get; set; }
.
WCF RESTサービスコールこの文字列配列のXML入力を下回っています
<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>
.
マイクライアントコードHTTPWebRequestでWebService呼び出しを行うことができる問題なく、サービスから、この文字列配列を除く他のすべてのデータが表示される可能性があります。配列をシリアル化するには、DataContractに何かが不足しています。
を助けてくださいCollectionDataContractでも幸運のない
[CollectionDataContract(Name = "photos")]
public class Photos : Collection<string>
.
はまた序数型
には必要ない既知型を追加した。[KnownType(typeof(string[]))]
public class PublishPhotos
{
.
これは完全なデータ契約クラス
です。[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; }
}
. 解決
最後に私はXMLの何が問題になったのか、httpWebRequestでは、この問題はシリアル化文字列配列であります。最も簡単な方法で、/publishersvc.svc/help for stringを訪問することができます。http://schemas.microsoft.com/2003/10/serialization/arialization/Arrays
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">http://localhost:8081/photos/1/1.jpg</string>
.
これが似たような問題に直面している人が助けることを願っています
他のヒント
私はこの問題に対する答えを考え出しました。 @ harlanb
データコントラクトシリアライゼーションから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; }
}
.
クライアントコードでは、XMLSerializerを使用してHttpWebRequestに書き込む
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();
.
私はこれが他の人々が同様の問題を抱えているのを助けてくれることを願っています。
所属していません StackOverflow