Kel*_*lly 5 c# https webrequest
我需要登录网站并执行操作.该网站基于REST,因此我可以轻松登录(登录信息作为查询字符串包含在URL中,因此我不需要设置凭据):
CookieContainer cookieJar = new CookieContainer();
HttpWebRequest firstRequest = (HttpWebRequest) WebRequest.Create(loginUrl);
firstRequest.CookieContainer = cookieJar;
firstRequest.KeepAlive = true;
firstRequest.Method = "POST";
HttpWebResponse firstResponse = (HttpWebResponse)firstRequest.GetResponse();
Run Code Online (Sandbox Code Playgroud)
这有效并且让我登录.我得到一个cookie以维持会话并将其存储在上面显示的cookieJar中.然后我做第二个请求,例如:
HttpWebRequest secondRequest = (HttpWebRequest) WebRequest.Create(actionUrl);
secondRequest.Method = "POST";
secondRequest.KeepAlive = true;
secondRequest.CookieContainer = cookieJar;
WebResponse secondResponse = secondRequest.GetResponse();
Run Code Online (Sandbox Code Playgroud)
我确保将cookie分配给新请求.但由于某些原因,这似乎不起作用.我收到一个错误,告诉我"我的会话已超时或已过期",这是一个接一个地完成,因此它不是时间问题.
我已经使用Fiddler来检查HTTP头,但我发现这很困难,因为这是HTTPS.(我知道我可以解密它,但似乎效果不好.)
我可以把我的URL用于这个休息服务并将它们粘贴到firefox中,一切正常,所以它一定是我做错了而不是连接的另一端.
我对HTTPS不太熟悉.我是否需要做其他事情来维持我的会话?我认为cookie就是它,但也许我需要在这两个请求中保留其他东西?
这是我发送第一个请求时返回的标题(除了我更改cookie以保护无辜者!):
X-DB-Content-length=19
Keep-Alive=timeout=15, max=50
Connection=Keep-Alive
Transfer-Encoding=chunked
Content-Type=text/html; charset=WINDOWS-1252
Date=Mon, 16 Nov 2009 15:26:34 GMT
Set-Cookie:MyCookie stuff goes here
Server=Oracle-Application-Server-10g
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激,我的想法已经不多了.
在解密我的程序中的 HTTP 流量后,我终于让它工作了。
我返回的 cookie 没有列出 Path 变量。因此 .NET 获取当前路径并将其指定为 cookie 上的路径(包括当前页面)。即:如果位于http://mysite/somepath/somepage.htm,它将设置cookie path=/somepath/somepage.htm。这是一个错误,因为它应该分配给“/”,这是所有网络浏览器所做的。(希望他们能解决这个问题。)
注意到这一点后,我抓住了 cookie 并修改了路径属性,现在一切正常。
其他遇到此类问题的人请查看 Fiddler。.NET 使用 Windows 证书存储,因此要解密程序中的 http 流量,您需要按照此处的说明进行操作:http: //www.fiddler2.com/Fiddler/help/httpsdecryption.asp 。您还需要在 Fiddler 的 Options\HTTPS 选项卡下打开解密。