Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码中的会话Id和AllowAutoRedirect不工作。得到302_C# - Fatal编程技术网

C# 代码中的会话Id和AllowAutoRedirect不工作。得到302

C# 代码中的会话Id和AllowAutoRedirect不工作。得到302,c#,C#,我试图在下面的代码中从网站上抓取数据。该站点要求我设置会话id才能进入第二页。我试图从第一个页面提取会话id,并将其作为cookie添加到第二个页面的请求中,但这总是返回302错误。但是,如果我使用web浏览器,通过“开发人员”窗口提取会话id,并将其硬编码到第二个页面请求中,它将始终有效。我使用了Fiddler,它生成了下面的结果,但仍然没有解决这个问题的运气 private static void Main() { try {

我试图在下面的代码中从网站上抓取数据。该站点要求我设置会话id才能进入第二页。我试图从第一个页面提取会话id,并将其作为cookie添加到第二个页面的请求中,但这总是返回302错误。但是,如果我使用web浏览器,通过“开发人员”窗口提取会话id,并将其硬编码到第二个页面请求中,它将始终有效。我使用了Fiddler,它生成了下面的结果,但仍然没有解决这个问题的运气

    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”,这不是您想要的。

找到了答案。使其工作的步骤如下:

  • 发出初始请求并从响应中提取cookie。我用了一个饼干容器
  • 向“接受免责声明”页面发出请求。从第一个请求分配cookie容器,并将请求设置为不允许自动重定向
  • 再次请求根url分配cookie容器。响应返回预期的html

  • 我希望这对将来的人有所帮助

    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等不需要进入网站的下一页。