Вызов POST на внешний сайт с помощью C # (httpwebrequest)
-
22-08-2019 - |
Вопрос
Это сводит меня с ума, и я не могу понять, куда я бросаю мяч.Я следовал нескольким примерам, найденным через googlemonsta, но безрезультатно.Любой указатель на то, где я облажался, был бы сильно искажен.
var writer = new StringWriter();
param = "location=" + Server.UrlEncode(param);
byte[] paramStream = Encoding.ASCII.GetBytes(param + "¶m2=value");
var URL = "http://www.somesite.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2";
request.ContentLength = paramStream.Length;
using( var stream = request.GetRequestStream())
{
stream.Write(paramStream, 0, paramStream.Length);
}
var response = request.GetResponse();
string result;
using (var sr = new StreamReader(response.GetResponseStream()))
{
result = sr.ReadToEnd();
}
Спасибо!
Редактировать: Насколько я могу судить, он попадает на сайт (я возвращаю html), но параметры не перемещаются.Я в основном получаю представление о том, где появились бы значения, если бы это было успешно.Я попытался удалить первый &, но ничего не добился.
Редактировать: Отредактированный код, чтобы отразить изменения.
Решение
Возможно, избавиться от & в начале первого параметра?В остальном все в принципе выглядит нормально.(Проверьте имена параметров в вашем реальном коде - там, где у вас есть "paramater" в примере, почти наверняка должно быть "parameter" - но мы не знаем, как выглядит ваш реальный код или чего ожидает реальный сайт.)
Пожалуйста, дайте больше информации о том, что происходит на самом деле.Мы знаем, что это не работает, но существует множество различных возможных режимов сбоя :)
Возникает еще одна мысль - вы не указали длину содержимого.Я не уверен, заполняется ли это автоматически WebRequest
.Это стоило бы использовать Проволочная метка чтобы проверить, присутствует ли он в исходящем запросе.
Просто в качестве общего практического указания вы должны избавиться от WebResponse
, и вам не нужно звонить Close
если у вас уже есть using
инструкция для потока ответов:
string result;
using (WebResponse response = request.GetResponse())
{
using (var sr = new StreamReader(response.GetResponseStream()))
{
result = sr.ReadToEnd();
}
}
Другие советы
Вы уверены, что у вас есть все значения, необходимые для публикации?Однажды у меня был случай, когда в форме было скрытое поле ввода, которое было что-то вроде:
<input name="action" type="hidden" id="action" value="login">
и я должен был предоставить это в качестве параметра, поскольку:
&action=login
Убедитесь, что вы ничего не упустили из формы, вот что я хочу сказать...
Редактировать: Еще одна вещь:Я просто еще раз просмотрел свой код, где я это сделал, и заметил, что у меня там тоже была эта строка:
request.ContentLength = bytes.Length;
Не уверен, нужно ли вам это, но я заметил, что вы не устанавливали длину.
Это не что-то такое простое, как возврат каретки / новая строка после параметров, не так ли?Просматривая некоторые документы по HTTP в Интернете, вы, по-видимому, нуждаетесь в пустой строке после этого.
(Я бы предложил подключиться к веб-серверу вручную и вставить ваш запрос.)