【问题标题】:Prefix SOAP XML Instead direct namespace前缀 SOAP XML 代替直接命名空间
【发布时间】:2013-07-02 00:06:16
【问题描述】:

我正在与我们的一位合作伙伴合作以整合我们的业务服务。我正在使用 WCF (.Net 3.5) 与合作伙伴 Web 服务进行通信。我认为合作伙伴 Web 服务是用 Java 编写的。

使用 SVC util 我生成了代理类。取而代之的是 DataContract 序列化程序,svcutil 使用了 xmlserializer。但是合作伙伴提供的 WSDL 和 Web 服务响应 SOAP xml 不匹配。由于小伙伴对更改 wsdl 不感兴趣,所以我手动更改了下载的 WSDL 以匹配响应。该问题已得到修复。

现在我遇到了不同的问题。当我向 Web 服务发送请求时,它总是失败。然后我使用 fiddler 将 SOAP 请求转发给合作伙伴。合作伙伴表示,请求发送的 xml 命名空间并未针对他们的系统进行验证。他们还回复了示例 SOAP 请求。

通过比较这两个请求,命名空间看起来是正确的。但是合作伙伴 xml 使用前缀来定义命名空间,并且元素都带有前缀。而我们这边的 xml 没有前缀,而是直接在父元素中使用命名空间。

这是我们发送的 XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <iL21stCentRq xmlns="http://schemas.WebServiceProvider.com/us/ileads/messages/Servicing">
        <ACORD xmlns="http://schemas.WebServiceProvider.com/us/ileads/types/Servicing">
            <SignonRq xmlns="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/">
                <SignonPswd>
                    <CustId>
                        <SPName>111</SPName>
                    </CustId>
                </SignonPswd>
            </SignonRq>
        </ACORD>
    </iL21stCentRq>
</s:Body>

这是合作伙伴期望我们提供的示例 XML

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stc="http://schemas.WebServiceProvider.com/us/ileads/messages/Servicing" xmlns:stc1="http://schemas.WebServiceProvider.com/us/ileads/types/Servicing" xmlns:acd="http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/">
<soapenv:Header/>
<soapenv:Body>
    <stc:iL21stCentRq>
        <stc:input>
            <stc1:ACORD>
                <acd:SignonRq>
                    <acd:SignonPswd>
                        <acd:CustId>
                            <acd:SPName>yourcompany.com</acd:SPName>
                        </acd:CustId>
                    </acd:SignonPswd>
                </acd:SignonRq>
            </stc1:ACORD>
        </stc:input>
    </stc:iL21stCentRq>
</soapenv:Body>

如果比较这两个 XML,命名空间 http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/ 在合作伙伴 xml 中以“acd”为前缀,但我们没有。合作伙伴希望我们以这种格式发送。

我认为 Partner Xml 不符合标准。这真是伙伴问题。但我别无选择,需要更改我这边的 Xml。

虽然我们可以在 WCF 服务中自定义序列化,但我不确定是否可以在此级别更改前缀。此外,我不确定 Partner Xml 是否遵循 XSD 的标准。

如果您能指导修改 WCF 序列化以适应上述更改,我将不胜感激。

【问题讨论】:

  • 你应该找一个懂XML的伙伴。前缀在 XML 中无关紧要 - 只有名称空间。如果你的伴侣不这么认为,那么他们就没有能力。
  • 标准的全部目的是让像您这样的人不必为您处理的每个合作伙伴定制您的软件。他们都应该遵循标准——这不是一个新标准。真的没有理由不支持它。
  • @JohnSaunders 我完全同意你的看法。
  • 这些 cmets 并没有那么有用。通常要求开发人员根据他们可以为您的业务提供的内容与某人进行集成。如果其他人设法使用他们提供的东西,这个人可能不愿意改变他们的东西以满足您的需求。我目前正在寻找这些解决方案,因为我处于这种情况,我找不到其他合作伙伴。所以我该怎么做?走出大门?

标签: wcf namespaces xml-serialization xmlserializer


【解决方案1】:

我修复了 SVC Util 生成的代理类。我添加了一个发出前缀的新属性。例如在类 SignonRq 中,我添加了以下属性。用前缀 acd 序列化 XML

        [XmlNamespaceDeclarations()]
    public XmlSerializerNamespaces xmlsn
    {
        get
        {
            XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
            xsn.Add("acd", "http://www.ACORD.org/standards/PC_Surety/ACORD1/xml/");
            return xsn;
        }
        set
        {
            //Just provide an empty setter. 
        }
    }

例如 ACORD 类,我添加了以下属性。这序列化了带有前缀 stc1 的 XML。

        [XmlNamespaceDeclarations()]
    public XmlSerializerNamespaces xmlsn
    {
        get
        {
            XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
            xsn.Add("stc1", "http://schemas.WebServiceProvider.com/us/ileads/types/Servicing");
            return xsn;
        }
        set
        {
            //Just provide an empty setter. 
        }
    }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多