HttpWebRequest к серверу https работает в Fiddler, но не из Visual Studio - PullRequest
0 голосов
/ 15 апреля 2011

Вот сценарий.Я написал код, использующий цифровой сертификат, чтобы ПОЛУЧИТЬ куки-файлы с защищенного URL-адреса, чтобы, в свою очередь, отправлять данные POST на другой URL-адрес, используя полученные куки-файлы и тот же цифровой сертификат.GET работает и куки извлекаются, POST возвращается с ошибкой 500. Я установил fiddler, чтобы увидеть, что происходит ... POST выглядит нормально ... куки присутствуют.Я использовал функцию в Fiddler, которая позволяет создавать запросы с помощью перетаскивания.POST точно такой же POST, записанный из кода C #, который был записан в Fiddler, и он работает!

Что Fiddler делает, что Visual Studio не делает?Он должен что-то делать, если Fiddler может POST-данные, но 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();

Ответы [ 2 ]

0 голосов
/ 22 апреля 2011

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

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

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");
0 голосов
/ 15 апреля 2011

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

req.ServicePoint.Expect100Continue = false; 

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

...