使用Elastic.Clients.Elasticsearch 8.9.3调用CreateAsync创建文档遇路由异常
使用.NET平台的Elastic.Clients.Elasticsearch 8.9.3库中的ElasticsearchClient,尝试通过以下代码创建新文档:
var createRequest = new CreateRequest<MyModelDto>("myindex", Id.From(dto)) { Document = dto }; await _client.CreateAsync(createRequest);
执行时抛出如下异常:
System.Exception: No route taking 1 parameters{index}/create/{id}
at Elastic.Clients.Elasticsearch.Requests.ApiUrls.Resolve(RouteValues routeValues, IElasticsearchClientSettings settings) in //src/Elastic.Clients.Elasticsearch/Core/Request/ApiUrls.cs:line 68
at Elastic.Clients.Elasticsearch.Requests.Request.ResolveUrl(RouteValues routeValues, IElasticsearchClientSettings settings) in //src/Elastic.Clients.Elasticsearch/Core/Request/Request.cs:line 52
at Elastic.Clients.Elasticsearch.Requests.Request.GetUrl(IElasticsearchClientSettings settings) in //src/Elastic.Clients.Elasticsearch/Core/Request/Request.cs:line 56
at Elastic.Clients.Elasticsearch.ElasticsearchClient.PrepareRequest[TRequest,TRequestParameters](TRequest request, Action1 forceConfiguration) in /_/src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs:line 279<br /> at Elastic.Clients.Elasticsearch.ElasticsearchClient.DoRequestAsync[TRequest,TResponse,TRequestParameters](TRequest request, Action1 forceConfiguration, CancellationToken cancellationToken) in //src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs:line 221
at Elastic.Clients.Elasticsearch.ElasticsearchClient.DoRequestAsync[TRequest,TResponse,TRequestParameters](TRequest request, CancellationToken cancellationToken) in //src/Elastic.Clients.Elasticsearch/Client/ElasticsearchClient.cs:line 179
at Elastic.Clients.Elasticsearch.ElasticsearchClient.CreateAsync[TDocument](CreateRequest`1 request, CancellationToken cancellationToken) in /_/src/Elastic.Clients.Elasticsearch/_Generated/Client/ElasticsearchClient.g.cs:line 483
- 核心问题是
Id.From(dto)未能从MyModelDto实例中解析出有效的非空ID值,导致请求路由中缺失{id}参数,触发路由匹配失败。 - 检查
MyModelDto的ID配置:确保类中存在被标记为Elasticsearch文档ID的属性(比如使用[PropertyName("_id")]特性标注,或通过客户端设置映射规则),保证Id.From(dto)能正确提取ID。 - 直接传入明确ID值:如果Dto自身有
Id属性,可改为直接传入该属性值,示例代码如下:
var createRequest = new CreateRequest<MyModelDto>("myindex", dto.Id.ToString()) { Document = dto }; await _client.CreateAsync(createRequest);
内容的提问来源于stack exchange,提问作者SimonD

