2016-01-04 3 views
1

Мне нужно отправить пользовательские полезные данные на веб-сервер, и я использую HttpWebRequest для этого. В моем случае это json-rpc. Я ничего не имею в виду, что я отправляю, если это не форма данных, закодированных как в html-формах или вложениях писем.Остановить HttpWebRequest от проверки моей полезной нагрузки

Смотрите мой код:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.0.108/api/homematic.cgi"); 

byte[] rpc_request = Encoding.ASCII.GetBytes("{ \"method\": \"Session.login\", \"params\": [ \"username\": \"root\", \"password\": \"root\" ], \"id\": null}"); 

request.ContentLength = rpc_request.Length; 
request.ContentType = "application/json"; 

using (var stream = request.GetRequestStream()) 
    stream.Write(rpc_request, 0, rpc_request.Length); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

Console.WriteLine("Status Code = {0}", response.StatusCode); 
Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd()); 

Очень простой. Но C# не нравится содержимое полезной нагрузки и выбрасывает System.Net.ProtocolViolationException при вызове request.GetRequestStream().Write. Я даже не могу начать запрос!

Почему C# вообще смотрит на содержимое полезной нагрузки и как я могу остановить его?

ответ

3

Если вы хотите написать в поток запросов, убедитесь, что используете какой-либо глагол, отличный от GET. A POST может быть хорошим кандидатом для отправки данных на веб-сервер.

request.Method = "POST"; 

Если вы явно не указать глагол HTTP, то GET предполагается, что объясняет, почему вы получаете сообщение об ошибке.

Кроме того, вы можете рассмотреть возможность обертывания IDisposable ресурсов в операциях using, чтобы сделать код лучше lil'bit. Не говоря уже о неиспользованной webClient переменную, которая может быть стоит того, чтобы избавиться от:

var request = (HttpWebRequest)WebRequest.Create("http://192.168.0.108/api/homematic.cgi"); 
string requestBody = "{ \"method\": \"Session.login\", \"params\": [ \"username\": \"root\", \"password\": \"root\" ], \"id\": null}"; 

request.ContentType = "application/json"; 
request.Method = "POST"; 
using (var stream = request.GetRequestStream()) 
using (var writer = new StreamWriter(stream)) 
{ 
    stream.Write(requestBody); 
} 

using (var response = (HttpWebResponse)request.GetResponse()) 
using (var stream = response.GetResponseStream()) 
using (var reader = new StreamReader(stream)) 
{ 
    Console.WriteLine("Status Code = {0}", response.StatusCode); 
    Console.WriteLine(reader.ReadToEnd()); 
} 

Console.ReadLine(); 
+0

Это похоже на работу, но почему C# сделать это по-другому, когда меняется метод? Часть полезной нагрузки в каждом методе одна и та же, или она? –

+0

Извините, я не уверен, что я понимаю ваш вопрос. Так работает протокол HTTP. Если вы хотите отправить тело вместе с запросом, используйте команды POST или PUT. Глагол GET не имеет тела. Так что это не проблема с C#. Структура просто говорит вам, что вы нарушаете протокол, который используете, пытаясь записать поток запроса при создании глагола GET. Для получения дополнительной информации я бы рекомендовал вам прочитать спецификацию протокола HTTP: http://www.rfc-base.org/txt/rfc-2616.txt –

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