首页 > 解决方案 > WCF 服务空响应

问题描述

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

标签: c#wcfsoap

解决方案


我放弃并序列化了响应对象(应该转到 Body 的对象),XmlSerializer它知道如何做到这一点。

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;

推荐阅读