WCF: Как заставить MessageContractattribute.iswarped = ложное поколение?
Вопрос
Другими словами: Как изменить контракт на обслуживание WCF, чтобы удалить дополнительное «сообщение» обертка из SOAP (принять WSDL)?
Я создал службу WCF, какой контракт:
[ServiceContract(Namespace = "http://blabla/", Name = "DiagnosticApplication")]
public interface IReceiveApplication
{
[OperationContract]
string Test(XmlElement e);
}
Так что моя СЦ принимает сейчас такие сообщения
<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>
Но Legacy Client отправляет такие сообщения (сообщение 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). Я вижу, что сгенерированный код использует MessageContract.iswrapperd = False Reeded Genered Classes, но я не могу изменить сгенерированный код, так. Я должен как-то изменить работу по эксплуатации и попросить 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;
}
}