WCF:MessageContractAttribute.isWrapped = false Generationを強制する方法は?
質問
言い換えれば、WCFサービス契約を変更して、SOAPメッセージ(WSDLを採用)から追加の「メッセージの」ラッパーを削除する方法は?
契約書が次の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:e 逃したレベル)
<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>
Ok。ゼロから「WSDL」を作成しました。まず、メッセージラッパーを削除してから、サンプル契約(CS)を生成しました。生成されたコードがmesageContract.iswrapperd = false near near near near near near near near near near codeを使用することがわかりますが、生成されたコードは変更できません。どういうわけか操作契約を変更し、WCFに適切なMessageContractを使用してメッセージを生成するように依頼する必要があります。
解決
私には考えがあります:私はどういうわけか生成するように頼むべきです
<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;
}
}
所属していません StackOverflow