2

我有以下卷曲代码:

curl 'localhost:8983/solr/sessions/update?commit=true' -H 'Content-type:application/json' -d '[{"Session_SessionId":"da7007e9-fe7a-4bdf-b9e4-1a55034cf08f","Session_HasComments":{"set":true}}]'

我正在尝试转换为 C#,但每次我都收到一个错误,所以不确定我的代码是否正确......

这是我到目前为止所拥有的:

        string path = "http://localhost:8983/solr/sessions/update?commit=true";
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(path);
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            string json = "{\"Session_SessionId\":\"" + sessionId + "\"," +
                          "\"" + fieldName + "\":{\"set\":\"" + fieldValue + "\"}}";

            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
            }
        }

在这一行似乎总是 error () :

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

我得到的错误是:

The remote server returned an error: (400) Bad Request.","StackTrace":"   at System.Net.HttpWebRequest.GetResponse()

有任何想法吗?提前致谢!

戴夫

4

6 回答 6

1

也许是您删除了您正在流式传输到请求中的 JSON 内容中的方括号?尝试将 [ ] 添加回数据的开头/结尾。尽管“BadRequest”通常是非常严格的错误,它告诉您您的 HTTP 请求格式错误,但您的服务器实际上也可能在其他情况下返回该代码 - 例如缺少会话 ID - 这可能发生在此处。

注意差异:

-d '[{"Session_SessionId":"da70.....
    ^ bracket

string json = "{\"Session_SessionId\":\"" + sessionId + "\"," + ....
               ^ no bracket

和数据末尾相同。
但是,当然,这只是一个猜测。:)

于 2013-03-28T15:54:51.240 回答
0

服务器无法理解您的请求。您是否检查了 json 变量的输出。我相信 JSON 字符串没有正确生成。

为什么不使用JavaScriptSerializer.Serialize创建 JSON 字符串。

于 2013-03-28T16:05:07.230 回答
0

将更新处理程序与 JSON 对象一起使用需要遵循 更新 JSON - 更新命令中概述的 JSON 格式

于 2013-03-28T16:06:07.977 回答
0

正如另一位用户所建议的那样,您的 JSON 输出与 CURL 不匹配。尝试以下操作,而不是输入文本。

var data = new[]
{
    new
    {
        Session_SessionId = "da7007e9-fe7a-4bdf-b9e4-1a55034cf08f",
        Session_HasComments = new {set = true}
    }
};

var json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(data);

此外,您正在使用using关键字写入数据,并尝试在块内处理响应 - 它可能确实有所作为,但可能值得将其移出此块。

最后,您可能需要将数据编码为字节数组。

这是实现上述建议的代码。

string path = "http://localhost:8983/solr/sessions/update?commit=true";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(path);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

var data = new[]
{
    new
    {
        Session_SessionId = "da7007e9-fe7a-4bdf-b9e4-1a55034cf08f",
        Session_HasComments = new {set = true}
    }
};

string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(data);
byte[] byteData = new System.Text.ASCIIEncoding().GetBytes(json);

httpWebRequest.ContentLength = byteData.Length;
using (Stream stream = httpWebRequest.GetRequestStream())
{
   stream.Write(byteData,0,byteData.Length);
}

HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
string respStr = new StreamReader(resp.GetResponseStream()).ReadToEnd();

Console.WriteLine("Response : " + respStr);
于 2013-03-28T16:35:49.120 回答
0

只需使用SolrNet。如果您使用 Solr 4+ 执行此操作,则需要下载最新代码并自己构建,但这很容易。

于 2013-03-29T01:49:37.667 回答
0

戴夫,它对我有用。

您缺少方括号。只需将相应的行替换为以下内容:

字符串 json = "[{\"Session_SessionId\":\"" + sessionId + "\"," + "\"" + fieldName + "\":{\"set\":\"" + fieldValue + "\ "}}]";

于 2013-11-28T14:17:55.583 回答