mvc desde consumir consume c# asp.net-mvc httpclient asp.net-mvc-4 asp.net-web-api

c# - desde - Publicación de DateTime en un ApiController en ASP MVC 4(Beta)



httpclient post c# (4)

Cuando publico un objeto json con una propiedad de fecha en un ApiController no se deserializará en una fecha.

Código de sitio del servidor:

public class MegaTestController : ApiController { // POST /megatest public void Post(ttt value) { string sdf = "!sad"; } } public class ttt { public DateTime Date { get; set; } public string Name { get; set; } }

Luego hago una solicitud POST con el violinista

POST http: // localhost: 62990 / MegaTest HTTP / 1.1

User-Agent: Fiddler

Anfitrión: localhost: 62990

Tipo de contenido: text / json

Longitud del contenido: 54

{"Fecha": "/ Fecha (1239018869048) /", "Nombre": "Amigo"}

Pero el objeto que entra solo tiene la propiedad Name establecida, la propiedad Date es {01.01.0001 00:00:00}

¿Me falta alguna cabecera o configuración del proyecto?

Editar : las solicitudes provienen de un HttpClient . ¿Es posible formatear la fecha antes de enviar la solicitud con HttpClient ?

public Task<T> Create<T>(T item) { var service = new HttpClient(); service.BaseAddress = new Uri("http://localhost:62990"); var method = typeof(T).Name + "s"; // in this case it will be ttts var req = new HttpRequestMessage<T>(item); req.Content.Headers.ContentType = new MediaTypeHeaderValue("text/json"); return service.PostAsync(method, req.Content).ContinueWith((reslutTask) => { return reslutTask.Result.Content.ReadAsAsync<T>(); }).Unwrap(); } var data = new ttt { Name = "Dude", Date = DateTime.Now }; Create(data);

Editar : Este es un error conocido con el ASP MVC 4 Beta y la versión final de ASP MVC 4 usará Json.net como un serializador json hasta entonces puede usar el serializador XML predeterminado o cambiar el serializador Json predeterminado para Json.net . Se puede encontrar más información en el blog de hanselman


Este es un error conocido con ASP MVC 4 Beta y la versión final de ASP MVC 4 usará Json.net como un serializador json hasta entonces puede usar el serializador XML predeterminado o cambiar el serializador Json predeterminado para Json.net . Se puede encontrar más información en el blog de hanselman

Aquí hay un pequeño ejemplo del uso del Serializador XML predeterminado para enviar DateTime con HttpClient:

var service = new HttpClient(); service.BaseAddress = url; var mediaType = new MediaTypeHeaderValue("application/xml"); XmlMediaTypeFormatter formater = new XmlMediaTypeFormatter(); var req = new HttpRequestMessage<T>(item, mediaType, new MediaTypeFormatter[] { formater }); service.PutAsync(method, req.Content);

Pero si desea utilizar json, aquí hay una buena publicación en el blog sobre el uso de JSON.NET con ASP.NET Web API


Intente publicar su fecha / hora como "aaaa-MM-dd HH: mm: ss". ASP MVC lo manejará correctamente.


ASP.Net Web API utiliza el DataContractJsonSerializer que tiene errores relacionados con la serialización de DateTime . Debería usar JSON.Net en su lugar, e implementar un MediaTypeFormatter que use JSON.Net en lugar de DataContractJsonSerializer. Mira mi respuesta para una pregunta similar aquí .


Parece que la API web no acepta fechas en el antiguo formato AJAX de ASP.NET para los datos POST codificados en la URL. Parece que hay dos formatos que acepta las fechas codificadas por URL en este momento:

ShortDateString: "2/23/2012"

ISO: "2012-02-23T00: 00: 00"

El último es el formato ISO DateTime, y hay una variedad de fragmentos de código que puede encontrar para ayudarlo a convertir un objeto Date de JavaScript a ese formato. Varios mencionados aquí: ¿Cómo puedo generar una cadena con formato ISO 8601 en JavaScript?

La API web aún acepta el formato / Date () / si envía esos datos como JSON y configura correctamente Content-Type:

$.ajax({ url: ''MegaTest'', type: ''POST'', // Setting this Content-Type and sending the data as a JSON string // is what makes the old /Date()/ format work. contentType: ''application/json'', data: ''{ "Date":"/Date(1239018869048)/", "Name":"Dude" }'' });