使用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
相关产品推荐
相关产品推荐

