Веб-API не может сериализовать DateTime, отправленное как «LOGINDATE»: «2020-04-05T01: 00: 21.45 + 04: 00». принимает только дату (миллисекунды) - PullRequest
2 голосов
/ 05 апреля 2020

Может быть, я запутался или из-за работы на дому я не могу думать. У меня есть проект Web API 2.0, который получает модели в конечных точках. У меня есть android клиент, который отправляет дату в формате миллисекунд, и для той же конечной точки у меня есть MVC клиент, который отправляет дату в «LOGINDATE»: «2020-04-05T01: 00: 21.45 + 04: 00». дата с MVC не принимается API и выдает ошибку состояния модели, например

System.FormatException: DateTime content '2020-04-05T10: 52: 42.333 + 04: 00' делает не начинаются с '/ Date (' и заканчиваются ') /', как требуется для JSON.

Я заставил WebApi использовать форматер newtonsoft json, но когда я отлаживаю исключение я нашел

System.Runtime.Serialization.Json.JsonReaderDelegator.ParseJsonDateInDefaultFormat(String originalDateTimeValue)

Ниже приведен код WEBAPICONFIG для принудительного использования медиатипа newtonsoft.

var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.UseDataContractJsonSerializer = true;
JsonSerializerSettings CustomJsonSetting = new JsonSerializerSettings
{
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
    PreserveReferencesHandling = PreserveReferencesHandling.Objects,
    DateTimeZoneHandling = DateTimeZoneHandling.Local,
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    //DateFormatString = "yyyy-mm-dd HH:MM:ss"
};

CustomJsonSetting.Converters.Clear();
CustomJsonSetting.Converters.Add(new IsoDateTimeConverter());
JsonConvert.DefaultSettings = () => CustomJsonSetting;
jsonFormatter.SerializerSettings = CustomJsonSetting;
config.Formatters.Clear();
config.Formatters.Insert(0,jsonFormatter);

Затем из клиента MVC я сжимаю GZIP и отправляю вызов следующим образом:

var frmt = UniversalFormatters.GetJsonFormatter();
if (IsCompressionEnabled)
{
    var json = JsonConvert.SerializeObject(request, frmt.SerializerSettings);
    //new JavaScriptSerializer().Serialize(request);
    //
    client.DefaultRequestHeaders.Add("pHubCompression", "1");
    var content = new CompressedContent(
  new StringContent(json, Encoding.UTF8, "application/json"),
  CompressionMethod.GZip);
    return await client.PostAsync(EndPoint, content);
}
else
  return await client.PostAsync(EndPoint, request, frmt);

И Universal Formatter определен как

public static JsonMediaTypeFormatter GetJsonFormatter()
{
    if (JsonFormatter==null)
    {
        JsonFormatter = new JsonMediaTypeFormatter();
        JsonFormatter.UseDataContractJsonSerializer = true;

        JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        JsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
        JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
        JsonFormatter.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
        JsonFormatter.SerializerSettings.DateFormatString = "yyyy-MM-ddTHH:mm:ss";
    }
    return JsonFormatter;
}

Я немного занимался НИОКР, и люди упомянули, что я создаю свой собственный формат даты, который является решением проблемы, но я хотел знать, есть ли что-то не так с моей настройкой.

Моя модель определяется следующим образом:

  [System.Runtime.Serialization.DataContractAttribute(Namespace = "http://MyProj.Core.Entities", Name = "RequestObject{0}")]
public class RequestObject<T> : IDisposable//, IEntity
    //where T : IEntity, IEntityCollection, ICompositeEntity
{
    private UserInfo m_userInfo;
    private T m_obj;}

, а UserInfo определяется как

  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Namespace = "http://MyProj.Business.Contracts", Name = "UserInfo")]
public partial class UserInfo : BaseEntity, IEntity, IDisposable
{

    [System.Runtime.Serialization.DataMember(EmitDefaultValue = true)]
    public DateTime? LOGINDATE { set; get; }}

Извините за мой плохой английский Engli sh.

1 Ответ

0 голосов
/ 14 апреля 2020

в соответствии с вышеуказанным комментарием @ db c Я удалил JsonFormatter.UseDataContractJsonSerializer = true; эта строка из моих стартапов и все начинает работать. Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...