Построение POST в C # - PullRequest
       7

Построение POST в C #

3 голосов
/ 02 ноября 2010

Я написал следующий код для построения POST, используя класс PostData, который я нашел в stackoverflow.

        PostData pd = new PostData();
        pd.Params.Add(new PostDataParam("sessionId", "0", PostDataParamType.Field));
        pd.Params.Add(new PostDataParam("guestId", "1", PostDataParamType.Field));

        HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(new Uri("http://oe1235/test/uploadTest.php").AbsoluteUri);

        webrequest.ContentType = "multipart/form-data; boundary=" + pd.Boundary;
        webrequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        webrequest.Headers.Add("Accept-Language: en-gb,en;q=0.5");
        webrequest.Headers.Add("Accept-Encoding: gzip,deflate");
        webrequest.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
        webrequest.Headers.Add("Keep-Alive: 115");
        webrequest.Referer = "http://localhost/test/test.php";
        webrequest.Headers.Add("Cache-Control: max-age=0");
        webrequest.Method = "POST";


        byte[] content = Encoding.ASCII.GetBytes(pd.GetPostData());
        webrequest.ContentLength = content.Length;
        Stream request = webrequest.GetRequestStream();
        request.Write(content, 0, content.Length);
        try {
            Console.Write(webrequest.GetResponse());
        } catch (Exception e) {
            Console.Write("Error: " + e.ToString());
        }
        Console.ReadLine();

Я отслеживаю запрос / ответ с Чарльзом и получаюследующее:

POST /test/uploadTest.php HTTP/1.1
Content-Type: multipart/form-data; boundary=----------8cd4899a18b409a
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Referer: http://localhost/test/test.php
Cache-Control: max-age=0
Host: oe1235
Content-Length: 275
Expect: 100-continue

----------8cd4899a18b409a
Content-Disposition: form-data; name="email"

MyEmail
----------8cd4899a18b409a
Content-Disposition: form-data; name="sessionId"

0
----------8cd4899a18b409a
Content-Disposition: form-data; name="guestId"

1
----------8cd4899a18b409a--

Я перепробовал все, что только мог придумать, но все равно он кажется недействительным (нет ответа от моего POST-получателя, и Чарльз сообщает "Не удалось декодировать тело Multipart")Я сделал что-то не так. Моя граница выглядит хорошо, у меня есть разрывы строк во всех правильных местах, я сравнил его с POST, который создает Firefox, и они выглядят (в значительной степени - кроме одного или двух заголовков) идентично.

Ответы [ 3 ]

3 голосов
/ 02 ноября 2010

Сработало - я предположил, что когда граница указана, она должна включать два начальных символа, а не должна. Таким образом, моя граница, указанная в заголовке содержимого, должна быть:

----------8cd4899a18b409a

, а затем между каждым элементом:

------------8cd4899a18b409a 

Проще говоря, если ваша граница была:

Content-Type: multipart/form-data; boundary=myboundary

Тогда между каждым элементом должно быть:

--myboundary
1 голос
/ 02 ноября 2010

Возможно, проблема в том, что в начале границ отсутствуют две черточки.

См. http://en.wikipedia.org/wiki/MIME#Multipart_messages для получения дополнительной информации о том, как должно выглядеть составное тело.

0 голосов
/ 22 декабря 2011

Проверьте это .Это ответ от сообщества, которое никогда не подводило меня.Вы также можете проверить MSDN library .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...