HttpWebRequest к серверу https работает в fiddler, но НЕ из Visual Studio

#c# #post #httpwebrequest #fiddler

#c# #Публикация #httpwebrequest #скрипач

Вопрос:

Вот сценарий. Я написал код, использующий цифровой сертификат для получения файлов cookie с защищенного URL, чтобы, в свою очередь, отправлять данные обратно на другой URL, используя полученные файлы cookie и тот же цифровой сертификат. GET работает, и файлы cookie извлекаются, сообщение возвращается с ошибкой 500. Я установил fiddler, чтобы посмотреть, что происходит…СООБЩЕНИЕ выглядит нормально … файлы cookie присутствуют. Я использовал функцию в fiddler, которая позволяет создавать запрос с помощью перетаскивания. ОПУБЛИКУЙТЕ точно такой же ПОСТ, записанный из кода C #, который был записан в fiddler, и это сработает!

Что делает Fiddler, чего не делает Visual Studio? Должно быть, что-то происходит, если fiddler может отправлять данные, но Visual Studio возвращает ошибку 500. Вот код ниже:

 X509Certificate cert = new X509Certificate("mycert.pfx", "certpassword");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://servertoGETcookies/fileUpload.html");
req.CookieContainer = new CookieContainer();
req.Method = "GET";
req.ClientCertificates.Add(cert);

HttpWebResponse Response = (HttpWebResponse)req.GetResponse();
CookieCollection ck = req.CookieContainer.GetCookies(req.RequestUri);
string strcookie = ck[0].Value;
string strcookie2 = ck[1].Value;
Response.Close();

req = (HttpWebRequest)WebRequest.Create("https://servertoPOSTdatawithcookies/main");
req.CookieContainer = new CookieContainer();
Cookie auth = new Cookie("_wl_authcookie_", strcookie2);
Cookie jsess = new Cookie("JSESSIONID", strcookie);
auth.Domain = "server";
jsess.Domain = "server";
req.CookieContainer.Add(auth);
req.CookieContainer.Add(jsess);
req.ClientCertificates.Add(cert);
req.Method = "POST";

Byte[] data = ReadByteArrayFromFile("filewithdatatoPOST.txt");
req.ContentLength = data.Length;
Stream myStream = req.GetRequestStream();
myStream.Write(data, 0, data.Length);
myStream.Close();

HttpWebResponse Response2 = (HttpWebResponse)req.GetResponse();
Stream strm = Response2.GetResponseStream();
StreamReader sr2 = new StreamReader(strm);
Response2.Close();
  

Ответ №1:

Работает ли ваш код, если вы установили

 req.ServicePoint.Expect100Continue = false; 
  

во всех ваших веб-запросах?

Комментарии:

1. Спасибо, но теперь возникла другая проблема. Сообщение от fiddler отвечает ожидаемыми результатами (т. Е. отправлено x). Сообщение из Visual Studio выглядит так, как будто его не было (т. Е. Так же, как если бы я ничего не публиковал).

2. Предполагается, что текст в файле, который я публикую, должен действовать так, как если бы я нажал кнопку, чтобы загрузить файл с данными: code —расположение содержимого временной метки: form-data; name=»действие» FILEUPLOAD —расположение содержимого временной метки: form-data; name=»browseFile»;filename=»fileuploading.txt «Тип содержимого: текст / обычный счетчик ежедневно *** 12345,123, единица измерения, 11.04.2011 1,123.000 2,123.000

3. Извините… пытался отметить как полезный, но у меня здесь недостаточно репутации.

Ответ №2:

Решено!!! Это не было связано с Expect100Continue.

Итак, после нескольких недель устранения неполадок …. 6 разных программистов….Я понял это. Я не уверен, что это всегда верно, но в этом сценарии проблема заключалась в том, что URL, с которого мы получали файлы cookie,:

 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://servertoGETcookies/fileUpload.html");
  

не совпадал с URL, на который мы отправляли данные обратно:

 req = (HttpWebRequest)WebRequest.Create("https://servertoPOSTdatawithcookies/main");
  

Получение файлов cookie и отправка обратно на тот же URL-адрес исправили проблему:

 HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://servertoGETandPOSTcookies/main");
req = (HttpWebRequest)WebRequest.Create("https://servertoGETandPOSTcookies/main");