.net 登录网站时,Cookies是如何涉及的?
好的,我正在写一个程序,需要登录到一个网站,想从中获取一些信息 他是我的登录代码:.net 登录网站时,Cookies是如何涉及的?,.net,cookies,f#,httpwebrequest,fiddler,.net,Cookies,F#,Httpwebrequest,Fiddler,好的,我正在写一个程序,需要登录到一个网站,想从中获取一些信息 他是我的登录代码: module Webscraper = open System.Net open HtmlAgilityPack open Lolcr.Model open System.Collections.Specialized let logon = fun (address:string) studentNumber password-> let upl
module Webscraper =
open System.Net
open HtmlAgilityPack
open Lolcr.Model
open System.Collections.Specialized
let logon = fun (address:string) studentNumber password->
let upload values =
let wc = new WebClient()
wc.UploadValues (address, values)
let ToNameValueCollection nvs =
let col = new NameValueCollection()
for nv in nvs do
match nv with (n, v) -> col.Add(n, v);
col
let fields :List<string*string> =
("v_studentid",studentNumber) ::
("v_studentpin", password) ::
("b3", "Login") :: []
let resp = fields |> ToNameValueCollection |> upload;
resp |> Array.map char |> System.String.Concat
//and for viewing a page within the site:
let pageAt = fun (address : string) ->
let getWebStream =
let req = HttpWebRequest.Create address
let resp = req.GetResponse()
resp.GetResponseStream
let doc = new HtmlDocument()
getWebStream() |> doc.Load;
doc.DocumentNode
因此,我看它的最大区别是我没有发送任何cookies(我实际上不完全确定cookies是什么,想想看(我会查一下(编辑:完成))) 我应该送饼干吗? 在.net中,实现这一点的机制是什么?
我应该做些不同的事情吗?因为这是HTTPS?一般来说,当你登录到一个网站时,你必须有一些方法让网站在你从一页到另一页的过程中进行跟踪 这通常通过cookie或URL中的会话标识符来完成 现在,您需要知道两种cookies之间的区别 一种是会话cookie,它保留在客户端计算机的内存中,然后在您关闭浏览器(或会话关闭)后消失。这些仅包含引用服务器上用户唯一会话实例的唯一标识符。这样,服务器就可以在每次子序列页面点击时知道您是谁 另一种类型的cookie是物理cookie,您专门将其设置为将特定变量保存在客户端计算机上的文本文件中 如果查看您的响应,您有一个会话ID的引用,这意味着您在客户端计算机上确实有一个会话cookie:
Cookie: JSESSIONID=18F87DFEB1555A6FA644215FDAE5E506; __utma=55889711.14817822.1328281214.1328281214.1328281214.1; __utmz=55889711.1328281214.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=olcr%20uwa; __utmb=55889711.1.10.1328281214; __utmc=55889711
如果您使用会话,默认情况下会在asp.net中创建此cookie。是的,通常您需要保留cookie才能登录到站点。 CookieAwareWebclient,例如来自以下位置的客户端:, 让它变得简单。 F#等价物是
type CookieAwareWebclient (cookies) =
inherit WebClient()
member this.CookieContainer = cookies
new () = new CookieAwareWebclient(new CookieContainer())
override this.GetWebRequest (address:Uri) =
let req = base.GetWebRequest address
match req with
| :? HttpWebRequest as httpReq ->
httpReq.CookieContainer <- this.CookieContainer;
upcast httpReq
| _ -> req;
键入CookieAwareWebclient(cookies)=
继承WebClient()
成员this.CookieContainer=cookies
new()=新CookieAwareWebclient(新CookieContainer())
重写this.GetWebRequest(地址:Uri)=
let req=base.GetWebRequest地址
匹配请求
| :? HttpWebRequest作为HttpRequest->
httpReq.CookieContainer请求;
现在,只要您通过相同的Webclient执行所有webrequests(因此您必须使Webclient在整个模块中都可访问,并更改pageAt以使用它)
你会没事的“所以我看它的最大区别是我没有发送任何cookies(实际上我不完全确定cookies是什么,仔细想想(我会查一下))”先这样做。然后回来问一个问题,如果需要的话。它的拼写是“登录”…我现在已经查到了什么是cookies(我以前有一个模糊的理解),相信我的问题仍然是正确的。这个答案并没有告诉OP如何持久保存cookie以便登录网站。在确保他理解cookie的真正含义后,我指出他已经在他的网站上使用了会话cookie,并且每当使用会话时,.net都会自动创建该cookie。你认为我的回答中缺少什么信息,值得投否决票?1)我没有投否决票。2) 默认情况下,.Net
WebRequest
s没有cookie容器。服务器可能会尝试给您一个会话cookie,但客户端需要持久化它,而OP需要知道如何做。事实上,我编写的是客户端,而不是服务器。我现在就开始工作了,不过还是要感谢你的投入。
type CookieAwareWebclient (cookies) =
inherit WebClient()
member this.CookieContainer = cookies
new () = new CookieAwareWebclient(new CookieContainer())
override this.GetWebRequest (address:Uri) =
let req = base.GetWebRequest address
match req with
| :? HttpWebRequest as httpReq ->
httpReq.CookieContainer <- this.CookieContainer;
upcast httpReq
| _ -> req;