休息网络服务请求

时间:2017-04-26 15:54:35

标签: c# json rest wcf

我用json发布此对象

[DataContract(Namespace = "http://localhost:30366/avtorji")]
public class Avtor
{
    [DataMember]
    public int idAvtor { get; set; }
    [DataMember]
    public string ime { get; set; }
    [DataMember]
    public string priimek { get; set; }
    [DataMember]
    public DateTime datum_rojstva { get; set; }

    public Avtor() { }
}

这是我的要求:

{
  "idAvtor": 4,
  "ime": "M Vaqqas",
  "priimek": "Noob",
  "datum_rojstva": "2014-01-03 23:28:56"
}

我的功能是

public void DodajAvtorja(Avtor avtor)
{
    string connString = null;

    try
    {
        connString = "server=localhost;userid=;password;database=";
        MySqlConnection conn = new MySqlConnection(connString);
        MySqlCommand comm = conn.CreateCommand();
        //avtor.datum_rojstva.ToString("yyyy-MM-dd HH:mm:ss")
        comm.CommandText = "INSERT INTO avtor (idAvtor, ime, priimek, datum_rojstva)"
            +" VALUES (@idAvtor, @ime, @priimek, @datum_rojstva)";

        comm.Parameters.AddWithValue("@idAvtor", avtor.idAvtor);
        comm.Parameters.AddWithValue("@ime", avtor.ime);
        comm.Parameters.AddWithValue("@priimek", avtor.priimek);
        comm.Parameters.AddWithValue("@datum_rojstva", avtor.datum_rojstva);

        conn.Open();

        int dodanih = comm.ExecuteNonQuery();
        if (dodanih > 0)
        {
            UriTemplateMatch match = WebOperationContext.Current.IncomingRequest.UriTemplateMatch;

            UriTemplate template = new UriTemplate("/avtor/{idAvtor}");
            Uri novAvtorUri = template.BindByPosition(match.BaseUri, avtor.idAvtor.ToString());
            WebOperationContext.Current.OutgoingResponse.SetStatusAsCreated(novAvtorUri);
        }
        conn.Close();
    }
    catch (Exception)
    {

        throw;
    }
}

它给了我一个错误" 400 Bad Request"在它开始运作之前。我假设这是因为DateTime属性。你能用这种方式发送日期时间吗?什么是解决方案?

谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

WCF使用DataContractJsonSerializer进行JSON序列化。根据{{​​3}},此序列化程序对DateTime使用以下格式:

  

DateTime值以"/Date(700000+0500)/"的形式显示为JSON字符串,其中第一个数字(在提供的示例中为700000)是GMT时区中的毫秒数,常规(非日光)自1970年1月1日午夜以来的时间。这个数字可能是负值,表示较早的时间。示例中由"+0500"组成的部分是可选的,表示时间属于docs种类 - 也就是说,应该在反序列化时转换为本地时区。如果不存在,则将时间反序列化为Local

表示实际数字(本例中为“0500”)及其符号(+或 - )。

因此,您需要以这种方式格式化"datum_rojstva"

{
  "datum_rojstva": "/Date(1388791736000)/",
  "idAvtor": 4,
  "ime": "M Vaqqas",
  "priimek": "Noob"
}

有关格式化此类日期的帮助,请参阅Utc

有关Microsoft选择此格式的原因的一些历史记录,请参阅How do I format a Microsoft JSON date?