Оказывается, произошла ошибка при десериализации даты, потому что она была не в правильном формате. Я обнаружил ошибку, включив режим подробного отладки в клиенте WCF.
System.InvalidCastException: Невозможно назначить объект типа System.Xml.XmlNode [] объекту типа System.DateTime.
Устаревший веб-сервис возвращал «xsd: date» с датой и временем, когда тип данных должен был быть «xsd: dateTime».
Чтобы подтвердить, что это было причиной проблемы, я запросил две записи у веб-службы и манипулировал XML в переопределенном методе Message ReadMessage () и изменил автоматически сгенерированный прокси-класс. Это исправило проблему, и я знаю, что это не окончательное решение. Прежде чем я свяжусь с автором устаревшего веб-сервиса, есть ли у кого-нибудь какие-либо комментарии по поводу формата Soap date и dateTime?
Maybe the following date is valid in Soap Version 1.1 with ISO-8859-1 encoding:
<date xsi:type="xsd:date">2010-05-02 08:03:45</date>
If it is, is this an issue using a custom encoder or was it really the date type/format in the soap body? Microsoft only accepted that date in the following format:
<date xsi:type="xsd:dateTime">2010-05-02T08:03:45</date>
<customBinding>
<binding name="ISO8859Binding">
<customTextMessageEncoding messageVersion="Soap11" encoding="ISO-8859-1" mediaType="text/xml" />
<httpsTransport />
</binding>
</customBinding>
public override Message ReadMessage(Stream stream, int maxSizeOfHeaders, string contentType)
{
XmlReader reader = XmlReader.Create(stream);
XmlDocument doc = new XmlDocument();
// Log to a file.
StreamWriter sw = new StreamWriter(@"C:\dump2.txt");
doc.Load(reader);
doc.InnerXml = doc.InnerXml.Replace("xsd:date", "xsd:dateTime");
doc.InnerXml = doc.InnerXml.Replace("2010-05-02 08:03:45", "2010-05-02T08:03:45");
doc.InnerXml = doc.InnerXml.Replace("2010-05-02 12:38:06", "2010-05-02T12:38:06");
sw.WriteLine(doc.InnerXml);
sw.Flush();
sw.Close();
byte[] buffer = System.Text.Encoding.Default.GetBytes(doc.InnerXml);
Stream test = new MemoryStream(buffer);
XmlReader reader2 = XmlReader.Create(test);
return Message.CreateMessage(reader2, maxSizeOfHeaders, this.MessageVersion);
}
Еще раз спасибо,
Бреннан