2009-07-15 5 views
5

Ich habe eine einfache Echo Dienst, wo I ein Betriebsverfahren und ein Paar von Typen für Anfrage-/Antwort definiert haben:Warum umschließt WCF Anfrage-/Antworttypen in einem anderen XML-Element und wie kann dies verhindert werden?

[ServiceContract(Name = "EchoService", 
       Namespace = "http://example.com/services", 
       SessionMode = SessionMode.NotAllowed)] 
public interface IEchoService 
{ 
    [OperationContract(IsOneWay = false, 
         Action = "http://example.com/services/EchoService/Echo", 
         ReplyAction = "http://example.com/services/EchoService/EchoResponse")] 
    EchoResponse Echo(EchoRequest value); 
} 

Die Datentypen:

[Serializable] 
[DataContract(Namespace = "http://example.com/services/EchoService", 
       Name = "EchoRequest")] 
public class EchoRequest 
{ 
    public EchoRequest() { } 

    public EchoRequest(String value) 
    { 
     Value = value; 
    } 

    [DataMember] 
    public String Value { get; set; } 
} 

[Serializable] 
[DataContract(Namespace = "http://example.com/services/EchoService", 
       Name = "EchoResponse")] 
public class EchoResponse 
{ 
    public EchoResponse() { } 

    public EchoResponse(String value) 
    { 
     Value = value; 
    } 

    [DataMember] 
    public String Value { get; set; } 
} 

Hervorrufen Message.CreateMessage() auf einer Instanz von EchoRequest ergibt sich:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header /> 
    <s:Body> 
     <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService"> 
     <Value>hello, world!</Value> 
     </EchoRequest> 
    </s:Body> 
    </s:Envelope> 

... was genau ich will. Es scheint jedoch, dass der Dienst den Nachrichtentext erwartet weiter in einem anderen XML-Element gewickelt werden, wie folgt aus:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header /> 
    <s:Body> 
     <Echo xmlns="http://example.com/services"> 
     <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService"> 
      <Value>hello, world!</Value> 
     </EchoRequest> 
     </Echo> 
    </s:Body> 
    </s:Envelope> 

UPDATE: Dank Mark Antwort, ich Message statt Datacontract erforscht habe auf die Anfrage-/Antworttypen. Dies scheint näher zu sein, was ich will, aber jetzt geht es zu weit und erwartet nicht das äußere Typelement "EchoRequest".

Das ist verwirrend, da Message.CreateMessage scheinbar immer die korrekte XML-Datei erzeugt, also scheinbar eine Standardserialisierung verwendet, die ich konfigurieren möchte, um den Dienst zu akzeptieren. Missverständnis ich nur, wie Message.CreateMessage funktioniert?

Antwort

2

IIRC, WCF verwendet standardmäßig den Nachrichtenstil 'Wrapped'. Wenn Sie steuern möchten, wie Nachrichten serialisiert werden, können Sie explizite Nachrichten definieren, indem Sie mit dem MessageContractAttribute schmücken. Bei expliziten Nachrichtenverträgen können Sie die IsWrapped-Eigenschaft auf false festlegen.

In Ihrem Fall denke ich, dass EchoRequest und EchoResponse überhaupt nicht DataContracts sein sollten, sondern MessageContracts. Sie sehen für mich wie MessageContracts aus.

+0

Dank Mark, Ihr Vorschlag führte mich einen Weg, der half, mein Verständnis von SOAP zu WCF näher zu kartieren. Allerdings funktionieren die Dinge immer noch nicht richtig, und ich habe die Frage bearbeitet, wenn Sie mitspielen wollen. – codekaizen

Verwandte Themen