Вызов POST на внешний сайт с помощью C # (httpwebrequest)

StackOverflow https://stackoverflow.com/questions/698029

  •  22-08-2019
  •  | 
  •  

Вопрос

Это сводит меня с ума, и я не могу понять, куда я бросаю мяч.Я следовал нескольким примерам, найденным через googlemonsta, но безрезультатно.Любой указатель на то, где я облажался, был бы сильно искажен.

        var writer = new StringWriter();
        param = "location=" + Server.UrlEncode(param);
        byte[] paramStream = Encoding.ASCII.GetBytes(param + "&param2=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 в Интернете, вы, по-видимому, нуждаетесь в пустой строке после этого.

(Я бы предложил подключиться к веб-серверу вручную и вставить ваш запрос.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top