Вызов POST на внешний сайт с помощью C # (httpwebrequest) - PullRequest
0 голосов
/ 30 марта 2009

Это сводит меня с ума, и я не могу понять, куда я бросаю мяч. Я следовал за несколькими примерами, найденными через 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();
        }

Спасибо! * * 1004

РЕДАКТИРОВАТЬ: Насколько я могу судить, что он попадает на сайт (я получаю HTML обратно), но параметры не выдвигаются. Я в основном понимаю, где будут отображаться значения, если они будут успешными. Я пытался удалить первый & но никуда не попал.

РЕДАКТИРОВАТЬ: Отредактированный код для отражения изменений.

Ответы [ 3 ]

3 голосов
/ 30 марта 2009

Возможно избавиться от & со старта первого параметра? Кроме того, это в основном выглядит хорошо. (Проверьте имена параметров в вашем реальном коде - где у вас есть «paramater» в образце, это почти наверняка должно быть «параметром» - но мы не знаем, как выглядит ваш реальный код или что ожидает реальный сайт.)

Пожалуйста, дайте больше информации о том, что на самом деле происходит. Мы знаем, что это не работает, но есть много различных возможных режимов отказа:)

Возникает еще одна мысль - вы не указали длину контента. Я не уверен, заполнено ли это автоматически WebRequest. Было бы целесообразно использовать WireShark , чтобы проверить, присутствует ли он в исходящем запросе.

Точно так же, как общая практика, вы должны утилизировать WebResponse, и вам не нужно вызывать Close, если у вас уже есть оператор using для потока ответов:

string result;
using (WebResponse response = request.GetResponse())
{
    using (var sr = new StreamReader(response.GetResponseStream()))
    {
        result = sr.ReadToEnd();
    }
}
1 голос
/ 30 марта 2009

Вы уверены, что у вас есть все значения, необходимые для поста? Однажды у меня был случай, когда в форме было скрытое поле ввода, которое было что-то вроде:

<input name="action" type="hidden" id="action" value="login">

и я должен был указать это как:

&action=login

Убедитесь, что вы ничего не пропускаете из формы - вот что я говорю ...

РЕДАКТИРОВАТЬ: Еще одна вещь: я просто посмотрел свой код снова, где я это сделал, и заметил, что у меня там тоже есть эта строка:

request.ContentLength = bytes.Length;

Не уверен, если вам это нужно, но я заметил, что вы не устанавливали длину.

0 голосов
/ 30 марта 2009

Это не так просто, как возврат каретки / новая строка после параметров, не так ли? Глядя на некоторые документы по HTTP в интернете, вам, очевидно, понадобится пустая строка.

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

...