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

使用NEST API向Datastream发送消息时遇@timestamp缺失错误

解决NEST API向Elasticsearch数据流写入时缺失@timestamp的问题

问题根源:C#中@是关键字转义前缀,Message记录里的@timestamp字段在序列化时会自动去掉前缀,变成timestamp,但Elasticsearch数据流要求必须存在@timestamp字段,因此触发illegal_argument_exception错误。

以下是三种可行的解决方案:

方案一:使用NEST专属属性指定字段名

直接在Message的字段上添加PropertyNameAttribute,明确指定ES中的字段名:

using Nest;

record Message(string Message, [PropertyName("@timestamp")] DateTime @timestamp);

方案二:在ConnectionSettings中全局配置字段映射

初始化客户端配置时,为Message类型添加字段映射规则:

var node = new Uri($"{_baseUrl}:{_elasticPort}");
var settings = new ConnectionSettings(node)
    .BasicAuthentication("user", "pass")
    .DefaultMappingFor<Message>(m => m
        .PropertyName(p => p.timestamp, "@timestamp")
    );
var elasticClient = new ElasticClient(settings);

// 后续写入代码保持不变
var elasticResponse = await elasticClient.IndexAsync<Message>(new(_message, DateTime.UtcNow), d =>
{
    d.OpType(OpType.Create);
    d.Index(_index);
    d.Id("id");
    return d;
});

方案三:使用DataContract序列化属性

如果项目依赖System.Runtime.Serialization,可以用DataMember指定序列化后的字段名:

using System.Runtime.Serialization;

[DataContract]
record Message(
    [DataMember(Name = "Message")] string Message,
    [DataMember(Name = "@timestamp")] DateTime @timestamp
);

修改完成后重新发送请求,Wireshark会看到请求体中的时间戳字段名为@timestamp,符合Elasticsearch数据流的要求,即可解决报错。

内容的提问来源于stack exchange,提问作者BananaSupreme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:06:26