You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:47:10