2009-06-08 10 views
0

RESTスターターキットで試し始めたばかりで、自分のサービスを構築しようとしている道路ブロックにぶつかりました。私は、アカウント管理のためのサービスを作成しようとしている、と私は私のオブジェクトをシリアル化するサービスを受けることができない、次のエラーをスロー:WCF RESTサービスでXMLをデシリアライズできません

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.

をここにサービスの実際のコードは、(だ "のオフに基づいてプロジェクトに付属のDoWork」メソッド):

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; } 
} 

私は愚かな何をしないのです:

[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 
     }; 
    } 
} 

そして最後に、ではなく、少なくとも、ここですべての問題を引き起こしているオブジェクトがですか?

ありがとうございます!

答えて

4

問題は、メソッド名 "CreateAccount"と入力タイプ "CreateAccount"の間の名前空間の衝突です。

はまた、あなたはそうのようなのDataContractとしてあなたCreateAccountタイプをマークする必要があります。

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

    ... 
} 

同じ名前を維持したい場合は、あなたがCreateAccountクラスの名前空間を指定することができます。

返品の種類があることに気付きました。戻り値の型もDataContract属性でマークされていることを確認してください。また、これと同様のリターン形式を指定します。

ResponseFormat = WebMessageFormat.Xml 
+0

私はオブジェクトとメソッドとの名前の競合が考えられました。オブジェクト名を「CreateAccountRequest」に変更したほか、[DataContract]および[DataMember]属性を追加しましたが、運はありません。 –

+0

上記の編集を参照してください。サービス契約の属性も指定していることを確認してください。サービスインタフェースが必要です。これが、OperationContract属性とWebInvoke属性が存在する場所です。 – Doanair

1

まだ持っていない場合は、CreatAccountクラスの上に[DataContract]属性があると思います。

7

それは私がビジネスオブジェクトの属性[DataContract]に余分な値が欠落していたが判明しました。

[DataContract(Namespace = "")]

+1

ありがとうジョエル、あなたの答えは私の問題を解決する! –

0

にする必要があり、私は同様の問題を抱えていたが、私はのDataContract属性を持っていました。 xmlns = "http://uri.org"属性は、オブジェクトにxmlを読み込もうとしたときに、ルート要素から削除されました。

<Root_Element xmlns="http://uri.org"><Child_Element/>...</Root_Element> 
関連する問題