Java 服务 - SOAP 响应 return 对 .NET 始终为 NULL
Java Service - SOAP Responses return always NULL to .NET
我有一个 SOAP 1.1 服务,使用 Spring Boot in Java 开发,它可以毫无问题地响应我的任何请求并提供有效的 SOAP 响应。
现在的问题是,只要我将此服务作为服务引用添加到任何 .NET/C# 项目,就会创建引用,我可以发送请求但响应(肯定是从我的 SOAP 发送的- Service) 无法映射回来,我的 .NET 应用程序中的对象始终为 null。
我已经发现了可能的问题,但我不知道如何(甚至可能这样)更改我的 xsd/wsdl 以正确生成所有源。
首先这是我的 .xsd 来自我的 Java Spring 用于生成 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)]
并添加“表格=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”复杂类型中的“AppDataDataResult”元素,但是没用。
将此 属性 直接添加到 processingResponse 元素不起作用,因为它不可能,因为 是架构 definition/tag.[=15= 下的一个级别]
我还没有找到这个问题的任何具体解决方案,因为它似乎与 Spring 引导框架 Java 和 wsdl 的生成非常具体。
我希望有人能帮我解决这个问题,因为它似乎不是一个大问题(它“只是”一个需要在源代码生成过程中添加的属性)但我似乎找不到解决方案对此。在此先感谢您的帮助!
我发现了问题,这是一个非常简单的解决这个问题的方法 - 在我的 Spring 引导项目中,我返回了 JAXBElements 并且响应的参数是 "QName",它指示对象的回应。这里的问题是 SOAP-Response 没有相关的命名空间来在 .NET 中生成源期间识别对象。所以我向 QName-Object 添加了正确的 Namespace-URI,现在对象得到解析并且 returns 正确的响应:
final QName qname = new QName(NAMESPACE_URI, "processingResponse");
return new JAXBElement<>(qname, ProcessingResponse.class, processingResponse);
最后这是一个相当 stupid/simple 的问题,但我尝试了所有其他方法,但没有尝试过大多数 obvious/easiest。
我有一个 SOAP 1.1 服务,使用 Spring Boot in Java 开发,它可以毫无问题地响应我的任何请求并提供有效的 SOAP 响应。
现在的问题是,只要我将此服务作为服务引用添加到任何 .NET/C# 项目,就会创建引用,我可以发送请求但响应(肯定是从我的 SOAP 发送的- Service) 无法映射回来,我的 .NET 应用程序中的对象始终为 null。
我已经发现了可能的问题,但我不知道如何(甚至可能这样)更改我的 xsd/wsdl 以正确生成所有源。
首先这是我的 .xsd 来自我的 Java Spring 用于生成 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)]
并添加“表格=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”复杂类型中的“AppDataDataResult”元素,但是没用。
将此 属性 直接添加到 processingResponse 元素不起作用,因为它不可能,因为
我还没有找到这个问题的任何具体解决方案,因为它似乎与 Spring 引导框架 Java 和 wsdl 的生成非常具体。
我希望有人能帮我解决这个问题,因为它似乎不是一个大问题(它“只是”一个需要在源代码生成过程中添加的属性)但我似乎找不到解决方案对此。在此先感谢您的帮助!
我发现了问题,这是一个非常简单的解决这个问题的方法 - 在我的 Spring 引导项目中,我返回了 JAXBElements 并且响应的参数是 "QName",它指示对象的回应。这里的问题是 SOAP-Response 没有相关的命名空间来在 .NET 中生成源期间识别对象。所以我向 QName-Object 添加了正确的 Namespace-URI,现在对象得到解析并且 returns 正确的响应:
final QName qname = new QName(NAMESPACE_URI, "processingResponse");
return new JAXBElement<>(qname, ProcessingResponse.class, processingResponse);
最后这是一个相当 stupid/simple 的问题,但我尝试了所有其他方法,但没有尝试过大多数 obvious/easiest。