2009-07-31 5 views
0

Ich bin neu beim Erstellen WCF REST-Dienste - so lassen Sie mich bitte kwow, wenn ich hier etwas falsch mache.DataContractSerializer Ausgabe XML mit "Feld" an alle Elemente angehängt und außer Reihenfolge

Ich habe einen REST-basierten Dienst WCF entwickelt wurde, mit der folgenden Datacontract definiert:

namespace Messaging 
{ 
    [DataContract(Name = "Email", Namespace = "")] 
    public class Email 
    { 
     #region Fields 

     private string subject; 
     private string message; 
     private string address; 
     private string firstName; 
     private string lastName; 
     private string notifyWindowEnd; 
     private string eventNotificationID; 

     #endregion 

     #region Properties 

     /// <summary> 
     /// Email Subject. 
     /// </summary> 
     [DataMember(Name = "Subject", Order = 1)] 
     public string Subject 
     { 
      get { return subject; } 
      set { subject = value; } 
     } 

     /// <summary> 
     /// Email Body. 
     /// </summary> 
     [DataMember(Name = "Message", Order = 2)] 
     public string Message 
     { 
      get { return message; } 
      set { message = value; } 
     } 

     /// <summary> 
     /// Email Address of Recipient. 
     /// </summary> 
     [DataMember(Name = "Address", Order = 3)] 
     public string Address 
     { 
      get { return address; } 
      set { address = value; } 
     } 

     /// <summary> 
     /// First Name of Recipient. 
     /// </summary> 
     [DataMember(Name = "FirstName", Order = 4)] 
     public string FirstName 
     { 
      get { return firstName; } 
      set { firstName = value; } 
     } 

     /// <summary> 
     /// Last Name of Recipient. 
     /// </summary> 
     [DataMember(Name = "LastName", Order = 5)] 
     public string LastName 
     { 
      get { return lastName; } 
      set { lastName = value; } 
     } 

     /// <summary> 
     /// Time at which the Email will cease to be sent. 
     /// </summary> 
     [DataMember(Name = "NotifyWindowEnd", Order = 6)] 
     public string NotifyWindowEnd 
     { 
      get { return notifyWindowEnd; } 
      set { notifyWindowEnd = value; } 
     } 

     /// <summary> 
     /// ID of the Event for which the Email has been generated. 
     /// </summary> 
     [DataMember(Name = "EventID", Order = 7)] 
     public string EventID 
     { 
      get { return eventID; } 
      set { eventID = value; } 
     } 

     #endregion 
    } 
} 

Auf der Client-Anwendung, ich versuche zu einem Dienst POST (das verwendet diese Daten Kontrakt) mit der HttpWebRequest -Objekt mit der von einer DataContractSerializer(typeof(MessagingWS.Email)) generierten Ausgabe (da ich die Email-Klasse zur Verfügung habe, nachdem ich den WCF-Service mit 'Add Service Reference ...' als MessagingWS in der Client-Anwendung hinzugefügt habe). In jedem Fall ergibt sich die folgende Ausgabe, die eine 400 erzeugt - vom Service kommt Bad Request zurück, wenn ich versuche zu POST:

<email xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MessagingWS"> 
<propertychanged xmlns:a="http://schemas.datacontract.org/2004/07/System.ComponentModel" i:nil="true"> 
    <addressfield>[email protected]</addressfield> 
    <eventidfield>123456</eventidfield> 
    <firstnamefield>First</firstnamefield> 
    <lastnamefield>Last</lastnamefield> 
    <messagefield>Message Content</messagefield> 
    <notifywindowendfield>DateTime value</notifywindowendfield> 
    <subjectfield>Test Subject</subjectfield> 
</propertychanged> 

So habe ich am Ende mit allen Elementen angehängt mit „Feld“ nach oben , und sie sind nicht in der Reihenfolge, die ich im DataContract angegeben habe (sie nehmen die Standardreihenfolge an). Könnte mir bitte jemand sagen, was hier vor sich geht, und wenn ich versuche, etwas zu erreichen, was nicht möglich ist?

Ich habe festgestellt, dass, wenn ich die DataContract-Klasse vom Server auf den Client kopiert (und in einem anderen Namespace - Messaging2) enthalten war, wurde die Ausgabe wie erwartet serialisiert, wenn ich eine DataContractSerializer(typeof(Messaging2.Email)) verwendet. Soll ich das wirklich so machen? Es scheint zu funktionieren, aber ich denke, ich sollte in der Lage sein, die Klasse zu verwenden, die ich auf der Client-Seite bekomme, nachdem ich "Service-Referenz hinzufügen ..." ausgeführt habe.

Jede Hilfe wird sehr geschätzt - danke!

Antwort

0

Wie sieht die von Add Service Reference importierte E-Mail-Klassendefinition auf der Clientseite aus? Wenn ich raten müsste, würde ich sagen, dass es wahrscheinlich falsch ist (aus welchem ​​Grund auch immer). Eine Sache, die ich nicht verstehe, obwohl ... bist du sicher, dass das XML, das du zeigst, tatsächlich das ist, das vom DataContractSerializer in diesem Fall erzeugt wird? Für mich ergibt das keinen Sinn ... Woher kommt das Element, da es in deiner Klasse nicht definiert ist?

1

Ihr DataContract-Attribut sagt Namespace = "", aber Ihr XML-Beispiel sagt xmlns = "http://schemas.datacontract.org/2004/07/MessagingWS".

Versuchen Sie, Ihre Service-Referenz neu zu generieren.

Verwandte Themen