WCF: как применить MessageContractAttribute.IsWrapped = false генерация? - PullRequest
1 голос
/ 26 ноября 2010

Другими словами: как изменить контракт на обслуживание wcf, чтобы удалить дополнительную обертку «message» из сообщения мыла (принять 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>

но устаревший клиент отправляет такие сообщения ( 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 рядом с сгенерированными классами сообщений, но я не могу изменить сгенерированный код, поэтому. Я должен как-то изменить контракт операции и попросить wcf генерировать для меня сообщения с правильным MessageContract.

1 Ответ

1 голос
/ 26 ноября 2010

У меня есть идея: я должен как-то попросить сгенерировать не

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

но

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

APPEND:

И теперь я знаю, как это сделать: в контракте на обслуживание / операцию нет такой опции для генерации требуемого контракта сообщения, но можно просто создать собственный класс, пометить его атрибутом контракта сообщения.

[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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...