2010-11-25 25 views
1

換句話說:如何更改wcf服務合約以從soap消息中刪除附加的「消息」包裝(採用wsdl)?WCF:如何強制執行MessageContractAttribute.IsWrapped = false生成?

我已創建WCF服務,這契約是:

[ServiceContract(Namespace = "http://blabla/", Name = "DiagnosticApplication")] 
    public interface IReceiveApplication 
    { 
     [OperationContract] 
     string Test(XmlElement e); 
    } 

所以我的SC現在接受這樣的消息

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:epr="http://blabla/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <epr:Test> 
      <epr:e> 
      <anyxml/> 
      </epr:e> 
     </epr:Test> 
    </soapenv:Body> 
</soapenv:Envelope> 

但傳統的客戶端發送這樣的消息(消息的EPR:電子水平遺漏)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:epr="http://blabla/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <epr:Test> 
      <anyxml/> 
     </epr:Test> 
    </soapenv:Body> 
</soapenv:Envelope> 

好的。我從零創建了「wsdl」,首先刪除了消息包裝器,然後生成了示例合同(cs)。我可以看到生成的代碼在生成的消息類附近使用MessageContract.IsWrapperd = false,但我無法更改生成的代碼,所以。我應該以某種方式更改操作合同,並要求wcf爲我生成具有正確的MessageContract的消息。

回答

1

我有一個想法:我應該以某種方式要求產生不

<wsdl:part name="parameters" element="tns:Test"/> 

<wsdl:part name="parameters" type="xsd:any"/> 

附加:

現在我知道如何做到這一點:有沒有這樣的選擇在服務/操作合同中生成所需的消息合約,但可能只需創建自己的類,並將其標記爲消息合約屬性。

[ServiceContract(Namespace = "http://blabla/", Name = "DiagnosticApplication")] 
public interface IReceiveApplication 
{ 
    [OperationContract] 
    string Test(XmlElement e); 
} 

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 
[System.ServiceModel.MessageContractAttribute(IsWrapped = false)] 
public partial class MessageRequest 
{ 

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace = "", Order = 0)] 
    public XmlElement parameters; 

    public RCMR_IN000004FI01Request(){} 

    public RCMR_IN000004FI01Request(XmlElement parameters) 
    { 
     this.parameters = parameters; 
    } 
}