wcf – 前缀SOAP XML而不是直接命名空间

我正与我们的合作伙伴合作,整合我们的业务服务.我正在使用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序列化以适应上述更改,我将不胜感激.

我修复了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. 
        }
    }

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念