我想将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日期。
答案 0 :(得分:4)
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);
}
});
}
答案 1 :(得分:0)
您应该尝试将属性BodyStyle = WebMessageBodyStyle.Wrapped
更改为BodyStyle = WebMessageBodyStyle.Bare
。这样,框架就不会添加任何额外的XML装饰。
此外,您应该检查来自客户端的日期格式。 也许你应该以预先设定的格式从客户端发送它,然后在你的对象中有一个字符串属性,而不是DateTime。
您可以添加一个只读属性,使用已知的格式将日期字符串转换为DateTime。