java - Java 服务 - SOAP 响应总是返回 NULL 到 .NET
问题描述
我有一个用 Java 中的 Spring Boot 开发的 SOAP 1.1 服务,它可以毫无问题地响应我的任何请求并提供有效的 SOAP 响应。
现在的问题是,只要我将此服务作为服务引用添加到任何 .NET/C# 项目,就会创建引用并且我可以发送请求,但响应(肯定是从我的 SOAP 服务发送的)无法映射回来,并且我的 .NET 应用程序中的对象始终为空。
我已经发现问题可能是什么,但我不确切知道如何(如果它甚至可能像这样)更改我的 xsd/wsdl 以正确生成所有源。
首先是我的 Java Spring Boot 项目中的 .xsd,用于生成 WSDL 和服务参考:
以下是 C# 项目中 Visual Studio 生成的服务参考的代码:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute([NAMESPACE]/processing", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: System.Xml.Serialization.XmlElementAttribute("processingResponse", Namespace="http://[NAMESPACE]/base", IsNullable=true)]
public processingResponse processing([System.Xml.Serialization.XmlElementAttribute(Namespace="http://[NAMESPACE]/base", IsNullable=true)] processingRequest processingRequest) {
object[] results = this.Invoke("processing", new object[] {
processingRequest});
return ((processingResponse)(results[0]));
}
我发现我是否更改以下行
[return: System.Xml.Serialization.XmlElementAttribute("processingResponse", Namespace="http://[NAMESPACE]", IsNullable=true)]
并添加“Form=System.Xml.Schema.XmlSchemaForm.Unqualified”:
[return: System.Xml.Serialization.XmlElementAttribute("processingResponse", Namespace="http://[NAMESPACE]", IsNullable=true, Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
响应被正确映射到我的对象,目前它似乎像这样工作,没有任何问题。
问题是我想更改我的 .xsd 以从一开始就正确生成这些源 - 我已经尝试将 Form=Unqualified 添加到“processingResponse”complexType 内的“AppDataDataResult”元素中,但它不起作用。
将此属性直接添加到 processingResponse 元素也不起作用,因为这是不可能的,因为 <xs:element/> 是架构定义/标签下的一层。
我还没有找到任何具体的解决方案来解决这个问题,因为 Spring Boot Framework Java 和 wsdl 的生成似乎非常具体。
我希望有人可以帮助我解决这个问题,因为它似乎不是一个大问题(它“唯一”是在源生成过程中需要添加的一个属性),但我似乎无法找到解决方案。在此先感谢您的帮助!
解决方案
我发现了问题,这是一个非常简单的解决方案 - 在我的 Spring Boot 项目中,我返回 JAXBElements,响应的参数是“QName”,它指示响应的对象。这里的问题是 SOAP-Response 在 .NET 中生成源期间没有相关的命名空间来识别对象。所以我将正确的 Namespace-URI 添加到 QName-Object 中,现在对象得到解析并返回正确的响应:
final QName qname = new QName(NAMESPACE_URI, "processingResponse");
return new JAXBElement<>(qname, ProcessingResponse.class, processingResponse);
最后,这是一个非常愚蠢/简单的问题,但我尝试了其他所有方法,但没有尝试最明显/最简单的方法。
推荐阅读
- javascript - 像轮子一样围绕中心点旋转三角形
- javascript - 单击某个 css 类或 ID 时使用户的视口向上滚动
- r - `levels<-`(`*tmp*`, value = as.character(levels)) 中的错误:因子级别 [3] 重复
- android-emulator - 无法在具有 Core 2 cpu 的 PC 上运行模拟器
- r - Shiny中具有不同数据集的反应性条形图
- android - android中的slider和seekbar有什么区别
- c# - C#:什么是 "=> . <=" 运算符?
- reactjs - 我可以将浏览器或模拟器视图嵌入到 vs 代码中吗
- go - 在编译时读取文件
- rpgle - 条件:RPG中的正负数