我在Windows上使用ASP.NET API(.NET 4.6)上的Elasticsearch.NET(5.6),并尝试发布到AWS上托管的elasticsearch(我已尝试过5.1.1和6,两者都是相同的行为)。
我有以下代码将文档批量索引到Elasticsearch。图像多次调用以下代码块:
var node = new System.Uri(restEndPoint);
var settings = new ConnectionSettings(node);
var lowlevelClient = new ElasticLowLevelClient(settings);
var index = indexStart + indexSuffix;
var items = new List<object>(list.Count() * 2);
foreach (var conn in list)
{
items.Add(new { index = new { _index = index, _type = "doc", _id = getId(conn) } });
items.Add(conn);
}
try
{
var indexResponse = lowlevelClient.Bulk<Stream>(items);
if (indexResponse.HttpStatusCode != 200)
{
throw new Exception(indexResponse.DebugInformation);
}
return indexResponse.HttpStatusCode;
}
catch (Exception ex)
{
ExceptionManager.LogException(ex, "Cannot publish to ES");
return null;
}
它运行正常,可以将文件发布到Elasticsearch,但它只能运行80次,80次之后,它总会出现异常:
# OriginalException: System.Net.WebException: The operation has timed out
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at Elasticsearch.Net.HttpConnection.Request[TReturn](RequestData requestData) in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection.cs:line 148
最有趣的部分是:我试图将体积大小更改为200或30,结果是16000和2400,这意味着两者最终都是80次。 (每个文档大小非常相似)
有什么想法吗?感谢
答案 0 :(得分:0)
存在连接限制(另请参阅问题中来自@RussCam的评论)。所以真正的问题是持有连接的响应中的Stream
。
因此修复方法是indexResponse.Body.Dispose
(我还没有尝试过这个)或使用VoidResponse
:reportClient.BulkAsync<VoidResponse>(items);
,它不需要响应流。我尝试了第二个并且它有效。