WCF服务空响应

时间:2019-11-25 15:24:23

标签: c# wcf soap

根据调试器,我已经实现了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,因为这不是一个类。

1 个答案:

答案 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;