Не удается десериализовать XML в службе REST WCF - PullRequest
1 голос
/ 09 июня 2009

Я только начал играть со стартовым набором REST и наткнулся на дорожный блок, пытаясь создать собственный сервис Я пытаюсь создать службу управления учетными записями и не могу заставить службу сериализовать мои объекты, выдавая следующую ошибку:

Невозможно десериализовать тело XML с корневым именем 'CreateAccount' и корневым пространством имен '' (для операции 'CreateAccount' и контракта ('Service', 'http://tempuri.org/')) с использованием DataContractSerializer. Убедитесь, что тип соответствует XML добавлен в коллекцию известных типов сервиса.

Вот фактический код службы (основанный на методе DoWork, поставляемом с проектом):

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

И, наконец, что не менее важно, вот объект, который вызывает все проблемы:

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

Я что-то упустил глупо?

Заранее спасибо!

Ответы [ 4 ]

8 голосов
/ 09 июня 2009

Оказывается, я пропустил дополнительное значение в атрибуте [DataContract] бизнес-объекта.

Должно быть [DataContract(Namespace = "")]

4 голосов
/ 09 июня 2009

Кажется, проблема в конфликте пространства имен между именем вашего метода "CreateAccount" и вашим типом ввода "CreateAccount".

Кроме того, вы должны пометить тип CreateAccount как DataContract следующим образом:

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

    ...
}

Если вы хотите сохранить то же имя, вы можете указать пространство имен для класса CreateAccount.

Я заметил, что у вас также есть тип возврата. Убедитесь, что возвращаемый тип также помечен атрибутом DataContract. Также укажите формат возврата так:

ResponseFormat = WebMessageFormat.Xml
1 голос
/ 09 июня 2009

Если у вас его еще нет, я думаю, что атрибут [DataContract] выше вашего класса CreatAccount.

0 голосов
/ 26 июня 2009

У меня была похожая проблема, но у меня был атрибут DataContract. Однако мне не хватало атрибута xmlns = "http://uri.org" из корневого элемента при попытке прочитать xml обратно в объект.
например

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