HTTPS POST в C #, Winforms (Stream Writer, HttpWebResponse, HttpWebRequest) - PullRequest
1 голос
/ 17 марта 2012

ОБНОВЛЕНИЕ: я пытаюсь отправить данные в https URI.POST работает для HTTP, но не работает для HTTPS uri


Привет! Я создаю ac # winforms exe для публикации данных на веб-сайте.Код ниже.Проблема в том, что поток дублирует мои почтовые данные ..

Например: предположим, я хочу опубликовать это -> username=bob

Затем, когда я проверяю трафик, то, что фактически отправляетсяusername=bobusername=bob

Видите?Он дублирует, добавляет одну и ту же строку еще раз в конец буфера и отправляет ее.

Я схожу с ума, пытаясь найти проблему за два дня. Может ли кто-нибудь решить эту проблему или дать мне несколько советов?пожалуйста?спасибо ..

(длина содержимого правильно установлена ​​на 12, но он отправляет 24 байта, после добавления тех же данных еще раз в конец буфера)

Есть заголовки

POST /login/ HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Host: abc.test.com
Content-Length: 12

username=bobusername=bob
-

Это код, который я сейчас использую

string post_data = "username=bob";
string uri = "https://abc.test.com/login/";

HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(uri); 
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";

byte[] postBytes = Encoding.ASCII.GetBytes(post_data);

request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;

Stream requestStream = request.GetRequestStream();

requestStream.Write(postBytes, 0, postBytes.Length);

MessageBox.Show(postBytes.Length.ToString());
requestStream.Close();

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string tmp = sr.ReadToEnd().Trim();

Я поставил точку останова в строке byte[] postBytes = Encoding.ASCII.GetBytes(post_data);, а postBytes содержит правильные данные ... но дважды выводит.

Почему это происходит?Я надеюсь, что я ясно ..

Ответы [ 2 ]

2 голосов
/ 17 марта 2012

Я опробовал ваш код, и он, кажется, работал должным образом (отправил HTTP-сообщение с полезной нагрузкой 12 байт) после того, как я изменил хост в URI на что-то адресуемое (использовалось http://adsf.com/login).wireshark:

Wireshark trace

Вы можете попробовать URI, который я использовал, чтобы увидеть, что вы получаете, это по крайней мере исключит ваш компьютер или код в качестве возможных источников проблемы.проблема исчезает при использовании другого URI, тогда проблема может быть между вашим сетевым оборудованием и веб-сервером (настройка обратного прокси-сервера, настройка веб-сервера, настройка сетевого коммутатора и т. д.).

1 голос
/ 17 марта 2012

Вы можете попытаться получить больше информации, установив конфигурацию трассировки, как описано на этой странице .Когда я попробовал ваш код, я получил следующий вывод:

System.Net Verbose: 0 : [2324] Data from ConnectStream#26756241::Write
System.Net Verbose: 0 : [2324] 00000000 : 75 73 65 72 6E 61 6D 65-3D 62 6F 62             : username=bob
System.Net Verbose: 0 : [2324] Exiting ConnectStream#26756241::Write()

Похоже, данные правильно записываются в ConnectStream.Что-то не так где-то еще?

И не забудьте закрыть объект WebResponse .

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