2009-06-08 4 views
0

Ich habe gerade angefangen mit dem REST Starterkit zu spielen, und ich habe eine Straßensperre erreicht, die versucht, meinen eigenen Dienst aufzubauen. Ich versuche, einen Dienst für die Kontoverwaltung zu schaffen, und ich kann nicht den Service erhalten, um meine Objekte zu serialisiert wird, die folgenden Fehler zu werfen:XML kann im WCF REST Service nicht deserialisiert werden

Unable to deserialize XML body with root name 'CreateAccount' and root namespace '' (for operation 'CreateAccount' and contract ('Service', ' http://tempuri.org/ ')) using DataContractSerializer. Ensure that the type corresponding to the XML is added to the known types collection of the service.

Hier ist der eigentliche Code für den Dienst (basierend aus dem ' DoWork‘Methode, die mit dem Projekt kam):

[WebHelp(Comment = "Creates a Membership account")] 
[WebInvoke(UriTemplate = "CreateAccount", RequestFormat = WebMessageFormat.Xml)] 
[OperationContract] 
public ServiceResponse CreateAccount(CreateAccount request) 
{ 
    try 
    { 
     // do stuff 

     return new ServiceResponse() 
     { 
      Status = "SUCCESS", 
      ErrorMessage = "" 
     }; 
    } 
    catch (Exception ex) 
    { 
     return new ServiceResponse() 
     { 
      Status = "ERROR", 
      ErrorMessage = ex.Message + "\n\n" + ex.StackTrace 
     }; 
    } 
} 

Und last, but not least, hier ist das Objekt, das alle Probleme verursacht:

public class CreateAccount 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public bool SignUpForNewsletter { get; set; } 
    public string Password { get; set; } 
} 

Fehle ich etwas dumm?

Vielen Dank im Voraus!

Antwort

4

Es scheint, das Problem ist ein Namespace-Konflikt zwischen Ihrem Methodennamen "CreateAccount" und Ihrem Eingabe-Typ "CreateAccount".

Außerdem haben Sie Ihre Create Typ als Datacontract markieren in etwa so:

[DataContract] 
public CreateAccount 
{ 
    [DataMember] 
    public string LastName { get; set; } 

    ... 
} 

Wenn Sie den gleichen Namen behalten möchten, können Sie einen Namespace für die Klasse Create angeben.

Ich bemerkte, dass Sie auch einen Rückgabetyp haben. Stellen Sie sicher, dass der Rückgabetyp auch mit dem DataContract-Attribut gekennzeichnet ist. Außerdem geben Sie das Rückgabeformat wie folgt:

ResponseFormat = WebMessageFormat.Xml 
+0

Ich dachte gerade über einen möglichen Namenskonflikt mit Objekt und der Methode nach. Ich habe den Objektnamen in 'CreateAccountRequest' geändert und die Attribute [DataContract] und [DataMember] hinzugefügt, aber kein Glück. –

+0

Siehe oben Bearbeiten. Stellen Sie sicher, dass Sie auch die Attribute in Ihrem Servicevertrag angeben. Sie sollten eine Service-Schnittstelle haben. Hier sollten die Attribute OperationContract und WebInvoke leben. – Doanair

1

Wenn Sie es nicht bereits haben, denke ich ein Attribut [DataContract] über Ihrer CreatAccount-Klasse.

7

Es stellt sich heraus, dass ich in der [DataContract] Attribut für das Business-Objekt einen zusätzlichen Wert fehlt. Sollte

sein [DataContract(Namespace = "")]

+1

Danke Joel, deine Antwort löst mein Problem.! –

0

Ich hatte ein ähnliches Problem, aber ich habe das Datacontract Attribut haben. Was ich jedoch vermisste, war das xmlns = "http://uri.org" -Attribut vom Wurzelelement, wenn ich versuche, die XML in das Objekt zurück zu lesen.
z.B.

<Root_Element xmlns="http://uri.org"><Child_Element/>...</Root_Element>