DataContractSerializer выводит XML с «полем», добавленным ко всем элементам и не в порядке - PullRequest
0 голосов
/ 31 июля 2009

Я новичок в создании служб WCF REST - поэтому, пожалуйста, дайте мне знать, если я здесь что-то не так делаю.

У меня есть служба на основе REST, разработанная с использованием WCF, со следующим определенным DataContract:

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

В клиентском приложении я пытаюсь отправить POST в службу (которая использует этот Контракт данных), используя объект HttpWebRequest с выводом, сгенерированным DataContractSerializer(typeof(MessagingWS.Email)) (так как у меня есть класс Email, доступный мне после добавления WCF с использованием «Добавить ссылку на службу ...» в качестве MessagingWS в клиентском приложении). В любом случае это приводит к следующему выводу, который генерирует 400-Bad Запрос, возвращающийся из службы, когда я пытаюсь 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>first.last@gmail.com</addressfield>
    <eventidfield>123456</eventidfield>
    <firstnamefield>First</firstnamefield>
    <lastnamefield>Last</lastnamefield>
    <messagefield>Message Content</messagefield>
    <notifywindowendfield>DateTime value</notifywindowendfield>
    <subjectfield>Test Subject</subjectfield>
</propertychanged>

Таким образом, я получаю все элементы, добавленные с «полем», и они не в порядке, указанном в DataContract (они предполагают порядок по умолчанию). Может кто-нибудь сказать мне, что здесь происходит, и если я пытаюсь сделать что-то, что невозможно?

Я заметил, что когда я скопировал класс DataContract с сервера на клиент (и включил его в другое пространство имен - Messaging2), выходные данные были сериализованы, как и ожидалось, когда я использовал DataContractSerializer(typeof(Messaging2.Email)). Это то, как я действительно должен это делать? Кажется, это работает, но я полагаю, что смогу использовать класс, который получаю на стороне клиента после запуска «Добавить ссылку на службу ...».

Любая помощь очень ценится - спасибо!

Ответы [ 2 ]

1 голос
/ 04 августа 2009

Ваш атрибут DataContract говорит: Namespace = "", но ваш пример XML говорит: xmlns = "http://schemas.datacontract.org/2004/07/MessagingWS".

Попробуйте восстановить ссылку на службу.

0 голосов
/ 01 августа 2009

Как выглядит определение класса Email, импортированное с помощью Add Service Reference, на стороне клиента? Если бы мне пришлось угадывать, я бы сказал, что это, вероятно, неправильно (по любой причине). Одна вещь, которую я не понимаю, хотя ... вы уверены, что XML, который вы показываете, на самом деле является сгенерированным DataContractSerializer в этом случае? Для меня это не имеет особого смысла ... откуда берется элемент, поскольку он не определен в вашем классе выше?

...