我想通过网络请求将json数据发布到elasticsearch。我得到以下代码的错误请求。添加了堆栈跟踪日志。
string responseFromServer = string.Empty;
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://localhost:9200/test/test");
webRequest.Method = "POST";
string username = "aaa";
string password = "aaa";
string auth = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(username + ":" + password));
webRequest.Headers.Add("Authorization", "Basic " + auth);
webRequest.ContentType = "application/json";
webRequest.Accept = "application/json";
using (var streamWriter = new StreamWriter(webRequest.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
var httpResponse = (HttpWebResponse)webRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
堆栈跟踪:
at System.Net.HttpWebRequest.GetResponse()
at APIResponse.Program.posttoelk(String json) in Program.cs:line 85
at APIResponse.Program.Main(String[] args) in :line 50
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
答案 0 :(得分:0)
我最近运行了一些代码,这些代码与您上面所做的非常相似,并且适用于我的大部分数据集[1]。因此,我认为上面的代码很好。从我的有限检查来看,似乎我的一些JSON对象由于未正确转义而失败。
我不认为您向我们展示了声明中json变量的内容:
streamWriter.Write(json);
与我上面所说的一致,您尝试在streamWrite.Write语句中编写的JSON可能格式错误或被错误地转义。我建议您在上述行中设置一个断点,并在Visual Studio调试器中检查json变量的内容,以确保您的JSON确实有效。
如果您有权使用Kibana,建议您打开Kibana开发工具,并根据
https://www.howtoforge.com/tutorial/elasticsearch-and-kibana-installation-and-basic-usage-on-ubuntu-1604/的“ 6.2插入一些数据到索引”部分在其中发布json变量的内容>
通过Kibana发布JSON时,您将立即获得有关JSON格式是否正确的反馈。在探索性测试期间,我觉得Kibana比GNU / Linux Curl语句或MS PowerShell Invoke-RestMethod命令更易于使用。
最后,使用C#时,仅使用Elastic Search NEST API和POCO可能会更容易:
https://www.elastic.co/guide/en/elasticsearch/client/net-api/1.x/nest-quick-start.html#_indexing
我不认为我会走这条路,但是对于某些人来说,这可能是一个更好的长期解决方案。
[1]-虽然我的许多JSON对象没有得到 索引,但我的许多其他JSON对象 did 也得到了索引。我认为这是因为我的一些JSON对象也格式不正确或无法正确转义。