c# - 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 因为这不是一个类。
解决方案
我放弃并序列化了响应对象(应该转到 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;
推荐阅读
- javascript - 在可排序更改上更新 javascript 对象中的位置
- html - 内容的可见性在移动视图中非常小
- java - 我们可以在不同的端口上运行 Spring REST API 吗?
- php - 使用 php 从内爆数据中删除第一个字符
- javascript - 为什么尝试启动 Mongo 服务器时 Nodemon 服务器崩溃?
- android - 如何在适用于 Android 的 Google Analytics (v4) 中获取广告系列数据?
- python - 如何使用从另一个文件python导入的变量的值
- spring-boot - Springboot 摘要认证支持
- ruby-on-rails - Rspec:如何测试在私有方法中引发的异常?
- java - 将 Netbeans 预捆绑的库添加到 Fresh Maven 项目