Проводка DateTime в ApiController в ASP MVC 4 (бета)

Когда я отправляю объект json с свойством date в ApiController, он не будет десериализоваться в дату.

Код сайта сервера:

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; }
}

Затем я делаю запрос POST с fiddler

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

User-Agent: Fiddler

Host: localhost: 62990

Content-Type: text/json

Content-Length: 54

{ "Дата": "/Дата (1239018869048)/", "Имя": "Чувак" }

Но объект, входящий только в набор свойств Name, имеет свойство Date {01.01.0001 00:00:00}

Не хватает ли заголовков или настроек проекта?


Изменить. Запросы на самом деле поступают из HttpClient. Возможно ли отформатировать дату перед отправкой запроса с помощью 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);

Изменить. Это известная ошибка с бета-версией ASP MVC 4, а окончательная версия ASP MVC 4 будет использовать Json.net. как сериализатор json, до тех пор вы можете использовать стандартный сериализатор XML или отключить сериализатор Json по умолчанию для Json.net. Более подробную информацию можно найти в hanselman blog

Ответ 1

Это известная ошибка с бета-версией ASP MVC 4, а окончательная версия ASP MVC 4 будет использовать Json.net в качестве сериализатора json до тех пор вы можете использовать стандартный сериализатор XML или отключить стандартный сериализатор Json для Json.net. Более подробную информацию можно найти на блог hanselman

Вот небольшой пример использования стандартного XML-сериализатора для отправки DateTime с помощью 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);

Но если вы хотите использовать json, то здесь хорошая запись в блоге с использованием JSON.NET с веб-интерфейсом ASP.NET

Ответ 2

Постарайтесь опубликовать дату/время как "yyyy-MM-dd HH: mm: ss". ASP MVC будет обрабатывать его правильно.

Ответ 3

Похоже, что веб-API не принимает даты в старом формате ASP.NET AJAX для данных POST с кодировкой URL. Кажется, что есть два формата, которые в настоящее время принимают даты, закодированные URL:

ShortDateString: "2/23/2012"

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

Позднее формат ISO DateTime содержит множество фрагментов кода, которые можно найти, чтобы помочь преобразовать объект Date JavaScript в этот формат. Несколько упомянутых здесь: Как вывести строку в формате ISO 8601 в JavaScript?

Web API по-прежнему принимает формат /Date ()/format, если вы отправляете эти данные как JSON и правильно устанавливаете 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" }'
});

Ответ 4

ASP.Net Web API использует DataContractJsonSerializer, в котором есть ошибки, связанные с сериализацией DateTime. Вместо этого вы должны использовать JSON.Net и реализовать MediaTypeFormatter, который использует JSON.Net вместо DataContractJsonSerializer. Проверьте мой ответ на аналогичный вопрос здесь.