通过webrequest c#将json字符串发布到ElasticSearch

时间:2016-11-22 07:22:55

标签: c# elasticsearch

我想通过网络请求将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()

1 个答案:

答案 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对象也格式不正确或无法正确转义。