1

つまり、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) を生成しました。生成されたコードが、生成されたメッセージ クラスの近くで MessageContract.IsWrapperd=false を使用していることがわかりますが、生成されたコードを変更することはできません。どうにかして操作コントラクトを変更し、正しい MessageContract でメッセージを生成するように wcf に依頼する必要があります。

4

1 に答える 1

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;
    }
}
于 2010-11-25T21:47:51.117 に答える