Java 工具创建的 WSDL 文件的 WCF 序列化问题

2024-05-01

我的团队的任务是让几个内部开发的 .NET 客户端应用程序连接到一些新的 Java Web 服务。 Java Web 服务是第三方、供应商提供的 WSDL 文件,我们的团队修改/控制的能力有限...这意味着我们可能有权要求我们的供应商对 WSDL 进行轻微调整,但重大更改可能会要么不可行,要么很难提出要求。

也就是说,我们正在尝试利用 WCF/.NET 4.0 生成客户端所需的 .NET 代理类文件。代理客户端类文件生成过程执行没有问题。

问题是当我们尝试在客户端应用程序中使用代理类文件时。我已通过 Web 跟踪工具 Fiddler 验证原始 SOAP 消息请求未能通过线路发送到服务器。

当我尝试调用有问题的 Web 服务方法时收到的特定 .NET 异常消息如下所示:

System.InvalidOperationException 未处理 Message=XmlSerializer 属性 System.Xml.Serialization.XmlAttributeAttribute 在基本语言中无效。当 IsWrapped 为 true 时,仅支持 XmlElement、XmlArray、XmlArrayItem、XmlAnyAttribute 和 XmlAnyElement 属性。 源=System.ServiceModel

当我检查 .NET 自动生成的代理类文件 Reference.cs 时,我注意到我的 Web 服务方法的请求和响应消息如下所示:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="QueryPBOT_MXWO_OS", WrapperNamespace="http://www.ibm.com/maximo", IsWrapped=true)]
public partial class QueryPBOT_MXWO_OSRequest {

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=0)]
    public ConsoleApplication7.wsMaximo.PBOT_MXWO_OSQueryType PBOT_MXWO_OSQuery;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=1)]
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string baseLanguage;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=2)]
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string transLanguage;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=3)]
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string messageID;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=4)]
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string maximoVersion;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=5)]
    [System.Xml.Serialization.XmlAttributeAttribute()]
    [System.ComponentModel.DefaultValueAttribute(false)]
    public bool uniqueResult;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=6)]
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="positiveInteger")]
    public string maxItems;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.ibm.com/maximo", Order=7)]
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="integer")]
    [System.ComponentModel.DefaultValueAttribute("0")]
    public string rsStart;

    public QueryPBOT_MXWO_OSRequest() {
    }

    public QueryPBOT_MXWO_OSRequest(ConsoleApplication7.wsMaximo.PBOT_MXWO_OSQueryType PBOT_MXWO_OSQuery, string baseLanguage, string transLanguage, string messageID, string maximoVersion, bool uniqueResult, string maxItems, string rsStart) {
        this.PBOT_MXWO_OSQuery = PBOT_MXWO_OSQuery;
        this.baseLanguage = baseLanguage;
        this.transLanguage = transLanguage;
        this.messageID = messageID;
        this.maximoVersion = maximoVersion;
        this.uniqueResult = uniqueResult;
        this.maxItems = maxItems;
        this.rsStart = rsStart;
    }
}

我知道阅读这篇文章的人会希望看到我们正在尝试使用的实际 WSDL 文件,但它相当大,而且我担心它的庞大大小会使查明错误变得相当困难。

我希望自动生成的客户端代理文件和 .NET 异常将帮助某人识别此 WCF 序列化问题。

我们已从 Java 供应商处确认,他们生成的 WSDL 风格是文档文字。在互联网上做了一些研究后,默认情况下似乎是 WCF。转换带有 doc-literal 的 WSDL 文件,这至少可以部分解释为什么我们会看到 WSDL 文件出现 WCF 序列化问题。

通过反复试验,我发现代理类文件中的以下属性装饰器是序列化问题背后的罪魁祸首:

[System.Xml.Serialization.XmlAttributeAttribute()]

如果我在代理类文件中注释掉此属性的所有实例并重新运行客户端应用程序,则 SOAP 消息会成功通过线路发送,并且我会收到从服务器返回的有效 Web 服务响应。

此修复总比没有好,但我非常喜欢一个不需要我自己或我的团队中的任何人不断调整这些 .NET 自动生成的代理类文件的解决方案。

我想知道是否可以通过各种 WCF 工具或修改 WSDL 文件来阻止 [System.Xml.Serialization.XmlAttributeAttribute()] 应用于我的请求和响应对象属性?

或者至少对为什么我们在 .NET 中使用 Java WSDL 文件看到这种序列化行为进行了高级描述?

提前致谢, 约翰


Use svcutil.exe实用程序与/wrapped生成代理类的选项。

这将创建与通过 Visual Studio 创建的类略有不同的类,其方式由 Ladislav Mrnka 在此描述。在客户端使用时,生成的代理应该不会出现 XmlAttribute 问题。

Example:

svcutil /t:code wsdl.xml /out:wsdl.cs /serializer:XmlSerializer /wrapped
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 工具创建的 WSDL 文件的 WCF 序列化问题 的相关文章

随机推荐