2012-06-19 137 views
4

我想發佈json對象到我的WCF服務發送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日期。

回答

3

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); 
      } 
     }); 
    } 
+0

工作。非常感謝你..幫了我很多 – user1394569

+0

我在OnDeserialized甚至得到錯誤。 「日期格式不正確」 –

0

您應該嘗試更改屬性BodyStyle = WebMessageBodyStyle.WrappedBodyStyle = WebMessageBodyStyle.Bare。這樣框架就不會添加任何額外的XML裝飾。

此外,你應該檢查來自客戶端的日期格式。 也許你應該以預先設定的格式從客戶端發送它,然後在你的對象中有一個字符串屬性,而不是DateTime。

您可以使用已知的格式添加只讀屬性,該屬性將日期字符串轉換爲日期時間。