Эластичный поиск .NET Core Неудачный низкоуровневый вызов по почте - PullRequest
0 голосов
/ 05 сентября 2018

У меня проблема при вызове Elastic из приложения веб-API .NET Core. Ниже приведены мои настройки, описание проблемы и отладочная информация.

Моя настройка

  • Веб-API, созданный на основе .NET Core 2.1
  • Библиотека классов, инкапсулирующая все мои НЕСТА логика
  • Консольное приложение тестирования Как веб-приложение, так и Консоль тестирования использует хранилище библиотеки классов, чтобы призыв к упругой.
  • Я могу запустить службу веб-API либо локально, либо локально в док-контейнере (Ubuntu)
  • Elasticsearch работает локально, Shield устанавливается с AD и нативной областью.
  • Все мои вещи используют заголовок run-as, а также консольное приложение и веб-API используют ту же привязку и пользователь запуска.

Проблема: Когда я выполняю запрос из моего консольного приложения, я получаю успех и результаты.
Когда я делаю то же самое через веб-API, я получаю следующую ошибку:

Неудачный низкоуровневый вызов по POST: / storeinventory / doc / _search

Странная часть: я создаю свой запрос с помощью метода построителя (используемого как для консоли, так и для веб-API), когда я беру ошибочный запрос, который я построил из вызова веб-API, и вставляю его в Kibana, он успешно выполняется.

Я тестировал curl локально, используя http://localhost:9200, а также имя хоста http://mysearch.example.com:9200 (которое настроено в моем файле хоста), оно работает на обоих.

Короче говоря, кажется, что выполнить запрос из моего веб-API не удается, даже если созданный запрос работает в Кибане. Тем не менее, он отлично работает из моего консольного приложения.

Я не уверен, чего мне не хватает, и с удовольствием расскажу обо всех идеях.

Отладочная информация ниже

Неудачный низкоуровневый вызов для POST: / storeinventory / doc / _search \ r \ n # Журнал аудита этого вызова API: \ r \ n - [1] BadRequest: Узел: http://elasticsearch.example.com:9200/ Взял: 00: 00: 01,3970177 \ г \ п # OriginalException: System.Net.Http.HttpRequestException: Невозможно установить соединение, поскольку целевая машина активно отказала ему ---> System.Net.Sockets.SocketException: Невозможно установить соединение, поскольку целевая машина активно отказывала в этом \ r \ n в System.Net.Http.ConnectHelper.ConnectAsync (Строковый хост, порт Int32, CancellationToken cancellationToken) \ r \ n
--- Конец внутренней трассировки стека исключений --- \ r \ n в System.Net.Http.ConnectHelper.ConnectAsync (Строковый хост, порт Int32, CancellationToken cancellationToken) \ r \ n в System.Threading.Tasks.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 в System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync (ValueTask 1 creationTask)\r\n at System.Threading.Tasks.ValueTask 1.get_Result () \ r \ n
по адресу System.Net.Http.HttpConnectionPool.SendWithRetryAsync (запрос HttpRequestMessage, логическое значение doRequestAuth, CancellationToken cancellationToken) \ r \ n по адресу System.Net.Http.RedirectHandler.SendAsync (запрос HttpRequest CancellationToken cancellationToken) \ r \ n в System.Net.Http.HttpClient.FinishSendAsyncBuffered (Task`1 sendTask, запрос HttpRequestMessage, CancellationTokenSource cts, логические disposeCts) \ r \ n в Elasticsearch.Net.HttpConnection.Request [TResponse] (RequestData requestData) \ r \ n # Запрос: \ r \ n {\ "from \": 0, \ "size \": 10, \ "query \": {\ "query_string \": {\ "запрос \": \ "виски \"}}, \ "изюминкой \": {\ "поля \": {\ "ItemName \": {}, \ "itemlocation \": {}}}, \ "aggs \": {\ "source \": {\ "Terms \": {\ "field \": \ "_ index \"}}, \ "Avg_Quantity \" ": {\" avg \ ": {\" field \ ": \" amount \ "}}}} \ r \ n # Ответ: \ r \ n \ r \ n"

И вот как я звоню, используя ElasticLowLevelClient :

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

А вот текст моего поста для запроса, созданного моим веб-API-приложением, которое работает в Кибане:

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

1 Ответ

0 голосов
/ 06 сентября 2018

Хорошо, я нашел исправление.

URL моего узла был http://localhost:9200. Это работает в консольном приложении, но не работает в проекте webapi. Я изменил его на http://127.0.0.1:9200, и это сработало.

Для записи (в случае, если кто-то смотрит на это в будущем и говорит «но это не решает мою проблему!») - раскрутите скрипач (или подобное приложение) и наблюдайте за трафиком.

Сообщение об ошибке там было более информативным. Это сказало мне, что ошибка была таймаутом. Это намного более полезно, чем ошибка, возвращаемая низкоуровневым клиентом.

Конечно, это само по себе не решило мою проблему, но заставило меня переоценить ситуацию, немного погуглить и найти кого-то, кто жалуется на завиток, переводящий localhost в IPv6 и использующий вместо этого 127.0.0.1.

...