c# - Elastic Search .NET Core 对 Post 的低级别调用不成功

标签 c# elasticsearch .net-core nest asp.net-core-webapi

我在从 .NET Core Web API 应用程序调用 Elastic 时遇到问题。以下是我的设置、问题描述和调试信息。

我的设置

  • 使用 .NET Core 2.1 构建的 Web API
  • 封装了我所有的类库 嵌套逻辑
  • 测试控制台应用程序 Web 应用程序和 测试控制台正在使用类库的存储库来制作 调用弹性。
  • 我可以在本地或 在本地的 docker 容器中 (Ubuntu)
  • Elasticsearch 在本地运行,Shield 安装有 AD 和 native 领域。
  • 我所有的东西都在使用 run-as header 以及控制台应用程序和 Web API 正在使用相同的绑定(bind)和运行用户。

问题: 当我从我的控制台应用程序执行查询时,我获得了成功和结果。
当我通过 Web API 执行相同操作时,出现以下错误:

Unsuccessful low level call on POST: /storeinventory/doc/_search

奇怪的是,我正在使用构建器方法(同时用于控制台和 Web API)构建我的查询,当我将我从 Web API 调用构建的失败查询粘贴到 Kibana 时,它成功了。

我已经使用 http://localhost:9200 在本地对 curl 进行了测试以及主机名 http://mysearch.example.com:9200 (在我的主机文件中配置)它适用于两者。

简而言之,从我的 Web API 进行查询似乎失败了,即使它构建的查询在 Kibana 中有效。但是,它在我的控制台应用程序中完美运行。

我不确定我错过了什么,并且会很乐意接受所有想法。

调试信息如下

Unsuccessful low level call on POST: /storeinventory/doc/_search\r\n# Audit trail of this API call:\r\n - [1] BadRequest: Node: http://elasticsearch.example.com:9200/ Took: 00:00:01.3970177\r\n# OriginalException: System.Net.Http.HttpRequestException: No connection could be made because the target machine actively refused it ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it\r\n at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)\r\n
--- End of inner exception stack trace ---\r\n at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)\r\n at System.Threading.Tasks.ValueTask1.get_Result()\r\n at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Threading.Tasks.ValueTask1.get_Result()\r\n at System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask1 creationTask)\r\n at System.Threading.Tasks.ValueTask1.get_Result()\r\n
at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)\r\n at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)\r\n at Elasticsearch.Net.HttpConnection.Request[TResponse](RequestData requestData)\r\n# Request:\r\n{\"from\":0,\"size\":10,\"query\":{\"query_string\":{\"query\":\"whiskey\"}},\"highlight\":{\"fields\":{\"itemname\":{}, \"itemlocation\":{}}},\"aggs\":{\"source\": {\"terms\": { \"field\": \"_index\"}},\"Avg_Quantity\": {\"avg\": { \"field\": \"quantity\"}}}}\r\n# Response:\r\n\r\n"

下面是我使用 ElasticLowLevelClient 进行调用的方式:

var searchResponse = lowlevelClient.Search<StringResponse>(_index, "doc", PostData.String(qJson));

这是我的查询帖子正文,由我在 Kibana 中运行的 Web API 应用程序构建:

{
    "from": 0,
    "size": 10,
    "query": {
        "query_string": {
            "query": "whiskey"
        }
    },
    "highlight": {
        "fields": {
            "itemname": {},
            "itemlocation": {}
        }
    },
    "aggs": {
        "source": {
            "terms": {
                "field": "_index"
            }
        },
        "Avg_Quantity": {
            "avg": {
                "field": "quantity"
            }
        }
    }
}

最佳答案

好的,所以我找到了解决方法。

我的节点 url 是 http://localhost:9200 .这适用于控制台应用程序,但不适用于 webapi 项目。我改成了http://127.0.0.1:9200它奏效了。

作为记录(以防将来有人看到这个并且说,“但这不能解决我的问题!”- 启动 fiddler(或类似的应用程序)并观察流量。

那里的错误信息更具描述性。它告诉我错误是超时。这比 lowlevelclient 返回的错误更有帮助。

虽然这并不能解决我的问题,但它让我重新评估了情况,做了更多的谷歌搜索,发现有人提示 curl 将 localhost 转换为 IPv6 并改用 127.0.0.1。

关于c# - Elastic Search .NET Core 对 Post 的低级别调用不成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52188217/

相关文章:

c# - 以编程方式调整 Azure 虚拟机大小的语法

java - Elasticsearch 无法与 Docker 一起运行

elasticsearch - 如何设置过滤器在聚合值达到特定阈值时返回?

c# - .net core2 Data isn't null 但 View Keep saying Data is Null

c# - 绑定(bind)到 DataAdapter 的 DataGridView 中错误的行被删除

c# - GC 行为和 CLR 线程劫持

c# - 异常处理(任务并行库).Net Framework 4.0 Beta 2

elasticsearch - 如何考虑单词顺序但不要求所有搜索到的单词都存在于ElasticSearch match_phrase查询的文档中?

c# - 无法调试 dotnet 核心 GenericHost docker 容器

c# - 当两个实体可以独立存在时, Entity Framework 核心一对零或一