WCF服务的SOAP格式

时间:2014-01-10 16:24:36

标签: .net wcf web-services serialization soap

我们正在尝试开发一种Web服务,它将取代我们客户使用的现有Web服务。这意味着来自WCF中的新Web服务的SOAP响应必须与来自当前Web服务的SOAP响应完全匹配,该Web服务是用Java编写的遗留服务。我们在使新服务返回与旧服务相同的SOAP响应时遇到了麻烦。

最初,我们从DataContract开始作为响应的结构,但由于它生成了一些额外的标签,我们切换到了MessageContract。

以下是使用DataContAract作为请求和响应属性的示例请求和响应。我们面临着使用DataContract的两个问题 -

  1. 我们无法以编程方式删除另外两个标记GetDataUsingDataContractReponseGetDataUsingDataContractResult

  2. 我们无法将BoolValue属性作为XML属性获取,而是显示为XML元素。

  3. 如果您能分享任何有关解决这两个问题的想法,我们将不胜感激。以下是使用DataContract的示例请求和响应。

    使用DataContract请求 -

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:mem="http://schemas.datacontract.org/2004/07/MemoPayment">
       <soapenv:Header/>
       <soapenv:Body>
          <tem:GetDataUsingDataContract>
             <!--Optional:-->
             <tem:composite>
                <mem:BoolValue>true</mem:BoolValue> <!--Not able to make this value as XML Attribute. Instead, always shows up as XML Element   -->      
                <mem:StringValue>Sam</mem:StringValue>
             </tem:composite>
          </tem:GetDataUsingDataContract>
       </soapenv:Body>
    </soapenv:Envelope>
    

    使用DataContract的响应:

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
       <s:Body>
          <GetDataUsingDataContractResponse xmlns="http://tempuri.org/">
             <GetDataUsingDataContractResult xmlns:a="http://schemas.datacontract.org/2004/07/MemoPayment" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">                                       à Extra tags showing up. Any way to remove them?
                <a:BoolValue>true</a:BoolValue>
                <a:StringValue>SamSuffix</a:StringValue>
             </GetDataUsingDataContractResult>
          </GetDataUsingDataContractResponse>
       </s:Body>
    </s:Envelope>
    

    为了对SOAP消息进行更多控制,我们已从DataContract切换到MessageContract,现在使用XML属性和XML元素按预期呈现响应。

    但是,使用MessageContract的问题是所有XML元素都显示为可选。示例 - 以下请求中的StringValue。如果您能根据自己的经验提出任何建议,我们将非常感激。

    使用MessageContract请求:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
       <soapenv:Header/>
       <soapenv:Body>
          <tem:MsgRequest boolVal="true">
             <!--Optional:-->
             <tem:StringValue>Sam</tem:StringValue>                                à Always showing up as Optional. Not able to control from the code. Any way to remove the Optional attribute?
          </tem:MsgRequest>
       </soapenv:Body>
    </soapenv:Envelope>
    

    使用MessageContract的响应:

    <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">
          <MsgResponse boolVal="true" xmlns="http://tempuri.org/">
             <StringValue>SamSuffix</StringValue>
          </MsgResponse>
       </s:Body>
    </s:Envelope>
    

1 个答案:

答案 0 :(得分:1)

过去,当我们的团队需要完全控制WCF服务输出时,我们使用XMLSerializer而不是数据和/或消息合同。

WCF支持XmlSerializer类,它不是WCF独有的。 XmlSerializer类支持比DataContractSerializer类更窄的类型集,但允许对结果XML进行更多控制,并支持更多XML Schema定义语言(XSD)标准。它也不需要可序列化类型的任何声明性属性。有关更多信息,请参阅.NET Framework文档中的XML序列化主题。

参考:
http://msdn.microsoft.com/en-us/library/ms733901(v=vs.110).aspx