C# 代码中的会话Id和AllowAutoRedirect不工作。得到302
我试图在下面的代码中从网站上抓取数据。该站点要求我设置会话id才能进入第二页。我试图从第一个页面提取会话id,并将其作为cookie添加到第二个页面的请求中,但这总是返回302错误。但是,如果我使用web浏览器,通过“开发人员”窗口提取会话id,并将其硬编码到第二个页面请求中,它将始终有效。我使用了Fiddler,它生成了下面的结果,但仍然没有解决这个问题的运气C# 代码中的会话Id和AllowAutoRedirect不工作。得到302,c#,C#,我试图在下面的代码中从网站上抓取数据。该站点要求我设置会话id才能进入第二页。我试图从第一个页面提取会话id,并将其作为cookie添加到第二个页面的请求中,但这总是返回302错误。但是,如果我使用web浏览器,通过“开发人员”窗口提取会话id,并将其硬编码到第二个页面请求中,它将始终有效。我使用了Fiddler,它生成了下面的结果,但仍然没有解决这个问题的运气 private static void Main() { try {
private static void Main()
{
try
{
HttpWebResponse response;
string sessionId = "";
if (Request_flow_gassco_no(out response))
{
StreamReader sReade1 = new StreamReader(response.GetResponseStream());
string HTM1 = sReade1.ReadToEnd();
sessionId = response.Headers["Set-Cookie"];
response.Close();
}
sessionId = sessionId.Split('=').GetValue(1).ToString().Trim().Split(';').GetValue(0).ToString().Trim();
//s = "4AEEFECB6A59102D0C2F4AC2DBA4362D";
if (Request_flow_gassco_no_disclaimer(out response, sessionId))
{
StreamReader sReade1 = new StreamReader(response.GetResponseStream());
string HTM1 = sReade1.ReadToEnd();
response.Close();
}
}
}
private static bool Request_flow_gassco_no(out HttpWebResponse response)
{
response = null;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://flow.gassco.no/disclaimer");
request.Headers.Add("Upgrade-Insecure-Requests", @"1");
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-GB,en-US;q=0.9,en;q=0.8");
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse)e.Response;
else return false;
}
catch (Exception)
{
if (response != null) response.Close();
return false;
}
return true;
}
private static bool Request_flow_gassco_no_disclaimer(out HttpWebResponse response, string session)
{
response = null;
try
{
Uri target = new Uri("http://flow.gassco.no/");
var cookieContainer = new CookieContainer();
var cookies = new Cookie("JSESSIONID", session) { Domain = target.Host };
cookieContainer.Add(cookies);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://flow.gassco.no/disclaimer/acceptDisclaimer?");
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true;
request.Headers.Add("Upgrade-Insecure-Requests", @"1");
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
request.Referer = "http://flow.gassco.no/disclaimer";
request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-GB,en-US;q=0.9,en;q=0.8");
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse)e.Response;
else return false;
}
catch (Exception)
{
if (response != null) response.Close();
return false;
}
return true;
}
在web浏览器中返回的会话id与在httpwebresponse中返回的会话id之间是否存在差异?执行此行后,“s”的值是多少
s="JSESSIONID="+s.Split('=').GetValue(1).ToString().Trim().Split(';').GetValue(0).ToString().Trim();
从外观上看,我认为这将是“JSESSIONID=\uu utma”,这不是您想要的。找到了答案。使其工作的步骤如下:
我希望这对将来的人有所帮助 s是从对网站的第一次调用返回的会话id。s=“JSESSIONID=F287828C5FB022CC833B3C6615ADCA24”Cookie的不同构造函数参数是什么?如果将cookie代码更改为以下,则相同的问题仍然存在。如果我使用从web浏览器获取的id硬编码会话id,则第二个请求有效。如果我使用从第一个request.Headers[“Set Cookie”]返回的值,那么它不会session=“4AEEFECB6A59102D0C2F4AC2DBA4362D”var cookieContainer=new cookieContainer();var cookies=newcookie(“JSESSIONID”,session){Domain=target.Host};cookieContainer.Add(cookies);s是由站点生成的,所以每次调用时都会发生更改。现在只需运行代码,以便s=“JSESSIONID=ab6088758773c6b188faff98d3a157b9d”。我已经确定google analytics等不需要进入网站的下一页。