我的WebAPI期待以下模型:
型号:
public class MyModel
{
public DateTime datetime {get;set; }
}
WebAction方法:
public IHttpActionResult Post([FromBody] MyModel model)
我正在使用RestSharp
发送请求。
var restRequest = new RestRequest(url, Method.POST)
{
RequestFormat = DataFormat.Json,
};
restRequest.AddBody(new MyModel {Datetime =DateTime.Now}, "");
但模型绑定始终为null(在webapi方面)。
我在Fiddler中看到以下内容:
{"datetime":"2014-09-25T07:22:56.7095909Z}"
任何想法为什么?
答案 0 :(得分:2)
将请求更改为:
restRequest.AddBody(new MyModel { datetime =DateTime.Now}, "");
在Fiddler,你想看到这个:
{"datetime":"2014-09-25T07:22:56.7095909Z}"
因为那将匹配您班级中的属性名称:
public DateTime datetime {get;set; }
然后,模型绑定应该能够从请求中选择它,并使用反射找到名为" datetime"的属性。在MyType实例中并为其设置值。
答案 1 :(得分:2)
最后似乎new JsonMediaTypeFormatter {UseDataContractJsonSerializer = true};
被证明是罪魁祸首。
详细信息:
在WebApiConfig
上课时,我尝试将XmlSerializer
设为默认值JsonSerializer
,而不是WebApi
中的默认值{。}}。
但在不知不觉中我设置了UseDataContractJsonSerializer = true
。结果证明这是罪魁祸首。
实际上,UseDataContractJsonSerializer
主要用于支持WCF
序列化。它序列化了所有已标记为DataContract
的模型属性。
问题是,此序列化程序希望date
采用epoch
格式。
在连线中,日期时间属性的行为与给定的here相同。
我在回答here中提到了这个问题,而这个回答here更能说明这一点。
由于我使用的是专为WCF
设计的序列化程序,因此它需要ASP.NET格式的日期(例如),\/Date(1234567890)\/.
请注意WebAPI
中的默认序列化程序是NewtonSoft Json Serializer。阅读here
因此,要在WebApi
中使用Json序列化程序,只需单独执行new JsonMediaTypeFormatter()
。