繁体   English   中英

HttpWebRequest到https服务器可在提琴琴中工作,但不能从Visual Studio中获得

[英]HttpWebRequest to https server works in fiddler but NOT from Visual Studio

这是场景。 我已经编写了代码,使用数字证书从安全的URL中获取cookie,然后使用检索到的cookie和相同的数字证书将数据回发到另一个URL。 GET工作和cookie被检索,POST返回500错误。我安装了提琴手以查看发生了什么... POST看起来很好...存在cookie。 我在fiddler中使用了该功能,该功能允许通过拖放创建请求。 POST与Fiddler中记录的C#代码中记录的POST完全相同,它可以工作!

Fiddler在做什么而不是Visual Studio? 如果提琴手可以过帐数据,但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();

如果您进行设置,您的代码是否有效

req.ServicePoint.Expect100Continue = false; 

在您所有的WebRequest上?

解决了!!! 它与Expect100Continue无关。

因此,经过数周的故障排除.... 6个不同的程序员....我明白了。 我不确定是否总是如此,但是在这种情况下,问题是我们从以下位置获取Cookie的网址:

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

与我们将数据发布回的网址不同:

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

获取Cookie并发布回相同的URL可以解决此问题:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM