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