0

私は WCF REST サービスを作成するのが初めてなので、ここで間違ったことをしている場合は教えてください。

次の DataContract が定義された、WCF を使用して開発された REST ベースのサービスがあります。

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

クライアント アプリケーションで、HttpWebRequest オブジェクトを使用して (このデータ コントラクトを使用する) サービスに POST しようとしていますDataContractSerializer(typeof(MessagingWS.Email))。 ...」をクライアント アプリケーションの MessagingWS として)。いずれにせよ、これにより次の出力が生成され、POST を試行したときにサービスから戻ってくる 400 - Bad Request が生成されます。

<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))、. これは私が本当にやるべき方法ですか?うまくいくようですが、「サービス参照の追加...」を実行した後にクライアント側で取得したクラスを使用できるはずです。

どんな助けでも大歓迎です - ありがとう!

4

2 に答える 2

1

DataContract 属性には Namespace="" と記載されていますが、サンプル XML には xmlns="http://schemas.datacontract.org/2004/07/MessagingWS" と記載されています。

サービス参照を再生成してみてください。

于 2009-08-04T08:15:15.577 に答える
0

Add Service Reference によってインポートされた Email クラス定義は、クライアント側ではどのように見えますか? 推測する必要がある場合は、おそらく間違っていると思います(何らかの理由で)。しかし、私が理解していないことが1つあります...表示されているXMLが、この場合、DataContractSerializerによって実際に生成されたものであると確信していますか? それは私にはあまり意味がありません...上記のクラスで定義されていないため、要素はどこから来たのですか?

于 2009-07-31T22:05:15.340 に答える