.NET 6 Azure Function反序列化DateTimeOffset失败求助
问题:.NET 6进程内Azure Function DateTimeOffset反序列化部署报错
我用.NET 6开发进程内Azure Function,接收包含两个DateTimeOffset字段的JSON负载,确认使用Newtonsoft进行序列化。
JSON示例
{ ... "CreatedDate": "2024-11-04T21:00:00.0000000+00:00", "DueDate": "2024-11-05T21:00:00.0000000Z", ... }
已配置的序列化设置
在Startup.cs中添加了自定义DateTimeOffset转换器(原本认为不需要此配置):
builder.Services.Configure<JsonSerializerSettings>(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<DateTimeOffset> { 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<DataPoint> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] Data data, ILogger log)
现在移除了Startup中所有DateTimeOffsetConverter注入代码,改为用HttpRequestMessage触发并手动反序列化:
public async Task<DataPoint> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, ILogger log) ... data = await JsonSerializer.Deserialize<WordCountData>(await req.Content.ReadAsStringAsync());
推测是框架无法完成初始绑定导致问题,寻求故障原因及解决方案。
内容的提问来源于stack exchange,提问作者phil
相关产品推荐
相关产品推荐

