2012-06-19 98 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。

您可以使用已知的格式添加只读属性,该属性将日期字符串转换为日期时间。