Elastic Search .NET Core在帖子上未成功进行低级调用

时间:2018-09-05 14:57:50

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

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

我的设置

  • 使用.NET Core 2.1构建的Web API
  • 封装我所有的类库 NEST逻辑
  • 测试控制台应用程序Web应用程序和 测试控制台正在使用类库的存储库来创建 呼吁弹性。
  • 我可以在本地或本地运行Web API服务 本地放置在Docker容器(Ubuntu)中
  • Elasticsearch在本地运行,Shield与AD和本机领域一起安装。
  • 我所有的东西都使用了运行方式标头以及控制台应用程序和Web API 使用相同的绑定和运行方式用户。

问题: 当从控制台应用程序执行查询时,我会获得成功和结果。
通过网络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(ValueTask 1.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"
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

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

我的节点网址是http://localhost:9200。这在控制台应用程序中有效,但在webapi项目中无效。我将其更改为http://127.0.0.1:9200并成功。

记录下来(以防将来有人在看这个东西,比如“但这不能解决我的问题!”)–拉动提琴手(或类似的应用程序)并观察路况。

该错误消息更具描述性。它告诉我错误是超时。这比lowlevelclient返回的错误有用。

仅凭这一点并不能解决我的问题,但这让我重新评估了情况,进行了更多谷歌搜索,发现有人抱怨curl将localhost转换为IPv6并改用127.0.0.1。

答案 1 :(得分:0)

如果您遇到此错误:

Invalid NEST response built from a unsuccessful (429) low level call on PUT

ServerError: Type: cluster_block_exception Reason: \"index [] blocked by: [TOO_MANY_REQUESTS/12/index read-only / allow delete (api)];

您的C盘可能快满了:

enter image description here