2013-03-28 4 views
2

У меня есть следующий завиток код:Преобразовать JSON локон на C#

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(); 
      } 
     } 

всегда кажется, ошибки() на этой линии:

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

Ошибка я получаю:

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

Любые идеи? Заранее спасибо!

Dave

+0

Какая ошибка вы получаете? Является ли localhost: 8983 активным? – Rob

+0

вы должны предоставить ошибку, которую вы получаете. –

+0

Ошибка, которую я получаю: Удаленный сервер возвратил ошибку: (400) Плохой запрос. "," StackTrace в System.Net.HttpWebRequest.GetResponse() – dhardy

ответ

1

Может быть, это то, что вы удалили квадратные скобки в содержании JSON, что вы потоковое в запросе? Попробуйте добавить [] к началу/концу данных. Хотя «BadRequest» обычно представляет собой довольно строгую ошибку, которая сообщает вам, что ваш HTTP-запрос неверен, ваш сервер может фактически вернуть этот код также для других случаев - например, отсутствующий идентификатор сеанса - что, вероятно, произошло здесь.

примечание разн:

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

и

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

и то же в конце данных.
Но, конечно, это только догадка. :)

+0

Добавлены квадратные скобки, без ошибок больше! Спасибо, теперь, чтобы понять, почему это не обновление ... – dhardy

+0

cool :) goodluck :) – quetzalcoatl

0

Ваш запрос не может быть разобран сервером. Вы проверяли выход переменной json. Я считаю, что строка JSON не генерируется должным образом.

Почему бы вам не использовать JavaScriptSerializer.Serialize для создания строки JSON.

0

Использование Обработчик Update с объектом JSON нужно будет следовать формату JSON, описанной в Update JSON - Update Commands

+0

Я считаю, что я уже следую этому, оригинальные работы с curl, мне просто нужно то же самое вложение в C# – dhardy

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); 
0

Просто используйте SolrNet. Если вы делаете это с помощью Solr 4+, вам нужно загрузить последний код и самостоятельно его создать, но это очень просто.

0

Дэйв, это сработало для меня.

Вам не хватало квадратных скобок. Просто замените соответствующую строку ниже:

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

Смежные вопросы