4

json オブジェクトを WCF サービスに投稿したい

私の唯一の問題は、彼の日付プロパティです。jquery datepicker から日付を取得し、サービスで c# datetime として取得したいと考えています。

私のサービス:

namespace Employee
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method = "POST", 
                   RequestFormat = WebMessageFormat.Json,
                   ResponseFormat = WebMessageFormat.Json,
                   BodyStyle = WebMessageBodyStyle.Wrapped)]
        bool UpdateEmployee(Employee Employee);
    }
}

そして、これは従業員です:

[DataContract]
public class Employee
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Department { get; set; }

    [DataMember]
    public int Salary { get; set; }

    [DataMember]
    public DateTime Hired { get; set; }
}

他のすべてのプロパティは正常に機能します。日付文字列をjson日付に変換するだけです。

4

2 に答える 2

5

DateTimeオブジェクトの予期される形式は、jQuery の日付ピッカーによって返される形式ではありません。WCF は、ASP.NET 形式 (例: \/Date(1234567890)\/) の日付を想定しています。

ただし、他の形式を使用することもできますが、単純ではありません (少なくとも .NET 4.0 までではなく、4.5 ではこれが大幅に改善されました)。基本的に、ワイヤから値を取得する文字列プロパティ (サービスが完全な信頼の下で実行されている場合はプライベートにすることができます) を使用しDateTime、シリアル化エピソード中にプロパティに接続します。このトリックの詳細については、http://blogs.msdn.com/b/carlosfigueira/archive/2011/09/06/wcf-extensibility-serialization-callbacks.aspxを参照してください。以下のコードで確認できます。

namespace StackOverflow_11105856
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method = "POST",
                   RequestFormat = WebMessageFormat.Json,
                   ResponseFormat = WebMessageFormat.Json,
                   BodyStyle = WebMessageBodyStyle.Wrapped)]
        string UpdateEmployee(Employee Employee);
    }

    public class Service : IService1
    {
        public string UpdateEmployee(Employee Employee)
        {
            return string.Format("Name={0},Hired={1}", Employee.Name, Employee.Hired.ToString("yyyy-MM-dd HH:mm:ss"));
        }
    }

    [DataContract]
    public class Employee
    {
        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public string Department { get; set; }

        [DataMember]
        public int Salary { get; set; }

        public DateTime Hired { get; set; }

        [DataMember(Name = "Hired")]
        private string HiredForSerialization { get; set; }

        [OnSerializing]
        void OnSerializing(StreamingContext ctx)
        {
            this.HiredForSerialization = this.Hired.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
        }

        [OnDeserializing]
        void OnDeserializing(StreamingContext ctx)
        {
            this.HiredForSerialization = "1900-01-01";
        }

        [OnDeserialized]
        void OnDeserialized(StreamingContext ctx)
        {
            this.Hired = DateTime.ParseExact(this.HiredForSerialization, "MM/dd/yyyy", CultureInfo.InvariantCulture);
        }
    }
}

そしてjQuery呼び出し:

    function StackOverflow_11105856_Test() {
        var url = "/StackOverflow_11105856.svc/UpdateEmployee";
        var data = {
            Name: "John Doe",
            Department: "Accounting",
            Salary: 50000,
            Hired: $("#StackOverflow_11105856_datepicker").val()
        };
        $.ajax({
            type: 'POST',
            url: url,
            contentType: "application/json",
            data: JSON.stringify({ Employee: data }),
            success: function (result) {
                $("#result").text(result.UpdateEmployeeResult);
            }
        });
    }
于 2012-06-19T21:14:17.763 に答える
0

プロパティBodyStyle = WebMessageBodyStyle.Wrappedを に 変更してみてくださいBodyStyle = WebMessageBodyStyle.Bare。このようにして、フレームワークは余分な XML 装飾を追加しません。

また、クライアントからの日付形式を確認する必要があります。おそらく、事前に設定された形式でクライアントから送信し、DateTime ではなく、オブジェクトに文字列プロパティを含める必要があります。

既知の形式を使用して、日付文字列を DateTime に変換する読み取り専用プロパティを追加できます。

于 2012-06-19T17:09:12.647 に答える