Функция отказывается десериализовать DateTimeOffset ⇐ C#

Место общения программистов C#
Anonymous
Функция отказывается десериализовать DateTimeOffset

Сообщение Anonymous »

Моей функции Azure .NET 6 отправляется полезная нагрузка JSON, включая два DateTimeOffset. Я почти уверен, что 6 в процессе использует Newtonsoft для сериализации.

Код: Выделить всё

{
...
"CreatedDate": "2024-11-04T21:00:00.0000000+00:00",
"DueDate": "2024-11-05T21:00:00.0000000Z".
...
}
В моем Startup.cs я даже настроил JsonConverter, хотя думаю, мне не нужно этого делать.

Код: Выделить всё

builder.Services.Configure(options =>
{
options.ContractResolver = new CamelCasePropertyNamesContractResolver();
options.Converters.Add(new DateTimeOffsetFormatConverter());
});
Если я опущу два значения DateTimeOffset, я не получу ошибок, поэтому они определенно вызывают ошибку.
У меня также есть двойное проверил, что json не искажен.
Локально все работает, но при развертывании в Azure я постоянно получаю:

Код: Выделить всё

Invalid cast from 'System.String' to 'System.DateTimeOffset'.
Есть предложения относительно того, что может происходить?
РЕДАКТИРОВАТЬ
Класс, в который выполняется десериализация, :

Код: Выделить всё

public class Data
{
...
public DateTimeOffset CreatedDate { get; set; }
public DateTimeOffset DueDate { get; set; }
...
}

public class DateTimeOffsetFormatConverter : JsonConverter
{
private const string ReadDateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffffK";
private const string WriteDateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffffzzz";

public override void WriteJson(JsonWriter writer, DateTimeOffset value, JsonSerializer serializer)
{
writer.WriteRawValue(value.ToString(WriteDateTimeFormat));
}

public override DateTimeOffset ReadJson(JsonReader reader, Type objectType, DateTimeOffset existingValue, bool hasExistingValue,
JsonSerializer serializer)
{
DateTimeOffset parsedDate;
bool hasParsed = DateTimeOffset.TryParseExact(reader.Value.ToString(), ReadDateTimeFormat,
System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None,
out parsedDate);
return hasParsed ?
parsedDate :
new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero);
}
}
Локальными стандартами и региональными стандартами Azure являются Северная Европа.
Решение
Изначально я собирал платформу для десериализовать мои данные при срабатывании:

Код: Выделить всё

public async Task Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] Data data,
ILogger log)
Вместо этого я удалил все внедрения DateTimeOffsetConverter из запуска, вернулся к запуску с помощью HttpRequestMessage и вручную выполнил десериализацию в теле функции.
Вместо этого я удалил все внедрения DateTimeOffsetConverter из запуска, вернулся к запуску с помощью HttpRequestMessage и вручную выполнил десериализацию в теле функции.
Вместо этого я удалил все внедрения DateTimeOffsetConverter из запуска, вернулся к запуску с помощью HttpRequestMessage и вручную выполнил десериализацию в теле функции.
Вместо этого я удалил все внедрения DateTimeOffsetConverter из запуска, вернулся к запуску с помощью HttpRequestMessage и вручную выполнил десериализацию в теле функции.
p>

Код: Выделить всё

public async Task Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req,
ILogger log)
...
data = await JsonSerializer.Deserialize(await req.ContentReadAsStringAsync());
Я могу только предположить, что платформа не смогла выполнить первоначальную привязку.


Подробнее здесь: https://stackoverflow.com/questions/791 ... timeoffset

Вернуться в «C#»