从.NET Core Web API应用程序调用Elastic时遇到问题。以下是我的设置,问题描述和调试信息。
我的设置
问题:
当从控制台应用程序执行查询时,我会获得成功和结果。
通过网络API执行相同操作时,出现以下错误:
POST上的低级调用失败:/ storeinventory / doc / _search
奇怪的是,我正在使用构建器方法构建查询(同时用于控制台和Web API),当我收到通过Web API调用构建的失败查询并将其粘贴到Kibana时,它会成功。
我已经使用http://localhost:9200和主机名http://mysearch.example.com:9200(在我的主机文件中配置)在本地对curl进行了测试。
因此,简而言之,似乎从我的Web API进行查询失败,即使它构建的查询在Kibana中也可以使用。但是,它可以从我的控制台应用程序完美运行。
我不确定自己缺少什么,会很乐意招待所有想法。
下面的调试信息
在POST上未成功进行低级调用:/ storeinventory / doc / _search \ r \ n#此API调用的审核记录:\ r \ n-[1] BadRequest:节点:http://elasticsearch.example.com:9200/执行了:00:00 :01.3970177 \ r \ n# OriginalException:System.Net.Http.HttpRequestException:无法建立连接,因为目标计算机主动拒绝它---> System.Net.Sockets.SocketException: 无法建立连接,因为目标计算机在System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32端口,CancelationToken cancelToken)上主动拒绝了它\ r \ n
---内部异常堆栈跟踪的结尾--- \ r \ n在System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32端口,CancellationToken cancelleToken)\ r \ n在 System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask1.get_Result()\r\n at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Threading.Tasks.ValueTask
1.get_Result()\ r \ n
1 creationTask)\r\n at System.Threading.Tasks.ValueTask 1.get_Result()\ r \ n > 在System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage请求,在System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage请求,布尔值doRequestAuth,CancellationToken cancelleToken)\ r \ n 在System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask,HttpRequestMessage request,CancellationTokenSource cts,Boolean disposeCts)的r \ n Elasticsearch.Net.HttpConnection.Request [TResponse](RequestData requestData)\ r \ n#请求:\ r \ n {\“从\”:0,\“大小\”:10,\“查询\”:{\ “ query_string \”:{\“ query \”:\“威士忌\”}},\“ highlight \”:{\“ fields \”:{\“ itemname \”:{}, \“ itemlocation \”:{}}},\“ aggs \”:{\“ source \”:{\“ terms \”:{\“ field \”:\“ _ index \”}}},\“ Avg_Quantity \ “:{\” avg \“:{\” field \“:\”数量\“}}}} \ r \ n#响应:\ r \ n \ r \ n”
而且,这就是我使用ElasticLowLevelClient拨打电话的方式:
var searchResponse = lowlevelClient.Search<StringResponse>(_index, "doc", PostData.String(qJson));
这是我的查询帖子的正文,它由我的Web API应用程序构建,可在Kibana中使用:
{
"from": 0,
"size": 10,
"query": {
"query_string": {
"query": "whiskey"
}
},
"highlight": {
"fields": {
"itemname": {},
"itemlocation": {}
}
},
"aggs": {
"source": {
"terms": {
"field": "_index"
}
},
"Avg_Quantity": {
"avg": {
"field": "quantity"
}
}
}
}
答案 0 :(得分:0)
好,所以我找到了解决方法。
我的节点网址是http://localhost:9200。这在控制台应用程序中有效,但在webapi项目中无效。我将其更改为http://127.0.0.1:9200并成功。
记录下来(以防将来有人在看这个东西,比如“但这不能解决我的问题!”)–拉动提琴手(或类似的应用程序)并观察路况。
该错误消息更具描述性。它告诉我错误是超时。这比lowlevelclient返回的错误有用。
仅凭这一点并不能解决我的问题,但这让我重新评估了情况,进行了更多谷歌搜索,发现有人抱怨curl将localhost转换为IPv6并改用127.0.0.1。
答案 1 :(得分:0)