根据调试器,我已经实现了WCF SOAP服务,可以正常工作。 但是,我在Postman或SOAP UI中没有收到任何答复。
我的ServiceContract函数正在返回Message对象,它应该:
public Message ReceiveMessage(Message message)
{
OTA.OTA_HotelResNotifRQ bodyObject;
using (System.Xml.XmlDictionaryReader reader = message.GetReaderAtBodyContents())
{
string content = reader.ReadOuterXml();
StringReader bodyText = new StringReader(content);
XmlSerializer bodySerializer = new XmlSerializer(typeof(OTA.OTA_HotelResNotifRQ));
bodyObject = (OTA.OTA_HotelResNotifRQ)bodySerializer.Deserialize(bodyText);
}
OTA.OTA_HotelResNotifRS rs = new OTA.OTA_HotelResNotifRS
{
Version = 1,
EchoToken = bodyObject.EchoToken,
TimeStamp = DateTime.Now,
Items = new object[] { new OTA.SuccessType() }
};
Message rsMessage = Message.CreateMessage(message.Version, "ReceiveMessageResponse", rs);
return rsMessage;
}
OTA.OTA_HotelResNotifRS是由xsd.exe创建的可序列化对象(我已经检查过,序列化工作正常)。
我没有收到任何错误,只是没有回应。
有什么主意吗?
是的,序列化有问题:
不希望使用数据合同名称>'SuccessType:http://schemas.datacontract.org/2004/07/OTA'的类型'OTA.SuccessType'。 >如果使用的是DataContractSerializer,请考虑使用DataContractResolver,或者>将任何静态未知的类型添加到已知类型的列表中-例如,通过>使用KnownTypeAttribute属性或将它们添加到传递给序列化程序的已知类型的列表中。
问题显然出在其中:
[System.Xml.Serialization.XmlElementAttribute("Errors", typeof(ErrorsType))]
[System.Xml.Serialization.XmlElementAttribute("Success", typeof(SuccessType))]
[System.Xml.Serialization.XmlElementAttribute("Warnings", typeof(WarningsType))]
public object[] Items
{
get { return this.itemsField; }
set { this.itemsField = value; }
}
我不知道应该如何应用KnownTypeAtribute,因为这不是一个类。
答案 0 :(得分:0)
我放弃了XmlSerializer
并将其序列化的响应对象(应该发送到Body的对象),知道该怎么做。
XmlReader respXML;
using (StringWriter respWriter = new StringWriter())
{
XmlSerializer respSerializer = new XmlSerializer(typeof(OTA.OTA_HotelResNotifRS));
respSerializer.Serialize(respWriter, rs); // rs is my response object
string resp = respWriter.ToString().Remove(0, 41); // just to remove <?xml version="1.0" encoding="utf-8" ?> on the top of produced string
respXML = XmlReader.Create(new StringReader(resp)); // finally, XmlReader has my body element
}
Message rsMessage = Message.CreateMessage(message.Version, "ReceiveMessageResponse", respXML);
return rsMessage;