WCF: Как заставить MessageContractattribute.iswarped = ложное поколение?

StackOverflow https://stackoverflow.com/questions/4280830

  •  28-09-2019
  •  | 
  •  

Вопрос

Другими словами: Как изменить контракт на обслуживание 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;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top