C#HttpWebRequest登录后,再获取其他站点

C#HttpWebRequest登录后,再获取其他站点,c#,authentication,post,get,httpwebrequest,C#,Authentication,Post,Get,Httpwebrequest,我编写了两个HttpWebrequests来登录并从站点获取HTML。 第一个响应的cookie被捕获到CookieContainer中,并在第二个请求中使用。 目前它正在捕获3个cookies。 第二个请求的响应具有找到/重定向状态代码302。 当在我的浏览器上打开页面并在页面上使用ctrl+u时,我可以找到“var login\u user”中填充了我的数据。 第一个请求的登录看起来很有效,因为它会在登录到指定的url后重定向我,但在其响应的HTML内容中,我可以找到“var login_u

我编写了两个HttpWebrequests来登录并从站点获取HTML。 第一个响应的cookie被捕获到CookieContainer中,并在第二个请求中使用。 目前它正在捕获3个cookies。 第二个请求的响应具有找到/重定向状态代码302。 当在我的浏览器上打开页面并在页面上使用ctrl+u时,我可以找到“var login\u user”中填充了我的数据。 第一个请求的登录看起来很有效,因为它会在登录到指定的url后重定向我,但在其响应的HTML内容中,我可以找到“var login_user=null”。 有人能帮我在第二个响应中获得一个状态码OK来获取它的HTML内容吗

        string loginUrl = @"https://id2.g-portal.com/login?redirect=https://www.g-portal.com/auth/login?redirectAfterLogin/https://www.g-portal.com/de/";
        string logDataUrl = @"https://www.g-portal.com/server/.../logs";

        CookieContainer cookieContainer = new CookieContainer();

        // POST request to login
        HttpWebRequest loginRequest = (HttpWebRequest)WebRequest.Create(loginUrl);
        loginRequest.Method = "POST";
        loginRequest.KeepAlive = true;
        loginRequest.ContentType = "application/x-www-form-urlencoded";
        loginRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0";
        loginRequest.CookieContainer = cookieContainer;

        byte[] dataBytes = Encoding.UTF8.GetBytes("login=" + username + "&password=" + password);
        loginRequest.ContentLength = dataBytes.Length;
        using (Stream postStream = loginRequest.GetRequestStream())
        {
            postStream.Write(dataBytes, 0, dataBytes.Length);
        }
        using (HttpWebResponse loginResponse = (HttpWebResponse)loginRequest.GetResponse())
        {
            Uri uri1 = loginResponse.ResponseUri;
            var status1 = loginResponse.StatusCode; // is OK
            using (StreamReader responseReader = new StreamReader(loginResponse.GetResponseStream()))
            {
                string loginHtmlContent = responseReader.ReadToEnd();   
                foreach (Cookie cookie in loginResponse.Cookies)
                {
                    cookieContainer.Add(cookie);
                }
            }
        }

        // GET request for logs
        HttpWebRequest logDataRequest = (HttpWebRequest)WebRequest.Create(logDataUrl);
        logDataRequest.Method = "GET";
        logDataRequest.ContentType = "application/x-www-form-urlencoded";
        logDataRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0";
        logDataRequest.CookieContainer = cookieContainer;
        logDataRequest.AllowAutoRedirect = false;

        string resultHTMLcontent = string.Empty;
        using (HttpWebResponse logDataResponse = (HttpWebResponse)logDataRequest.GetResponse())
        {
            Uri uri2 = logDataResponse.ResponseUri;
            var status2 = logDataResponse.StatusCode;   // is Found
            Console.WriteLine("Log data request succesfully");
            using (StreamReader responseReader = new StreamReader(logDataResponse.GetResponseStream()))
            {
                resultHTMLcontent = responseReader.ReadToEnd(); // is empty
            }
        }

你考虑过改用Selenium吗?@mjwills没有,我从来没有使用过它,昨天我在下拉列表中寻找一种选择的方法,因为这是我在第二个请求的站点上必须做的。尝试启用自动重定向(
[HttpWebRequest].AllowAutoRedirect=true;
)。如果它没有遵循重定向,请使用
位置
标题并自己遵循它(设置Referer,以防您有多个跃点)。我已经完成了这两个操作,它会将我重定向到与在您未登录时打开服务器url相同的方式。这就是为什么AllowAutoRedirect=false。这不是问题所在。您的登录过程不完整。必须传递所有输入元素(包括隐藏元素)及其值。如果不这样做,您将被重定向到同一个登录页面,一次又一次。顺便说一句,您需要:
CookieContainer CookieContainer=new CookieContainer()声明为字段,在登录过程之外,否则在调用之间不会保留cookie。不清楚该声明属于何处。你考虑过改用Selenium吗?@mjwills不,我从来没有使用过它,只是昨天我在寻找从下拉列表中选择的方法时读到了它,因为这是我在第二个请求的站点上必须做的。尝试启用自动重定向(
[HttpWebRequest].AllowAutoRedirect=true;
)。如果它没有遵循重定向,请使用
位置
标题并自己遵循它(设置Referer,以防您有多个跃点)。我已经完成了这两个操作,它会将我重定向到与在您未登录时打开服务器url相同的方式。这就是为什么AllowAutoRedirect=false。这不是问题所在。您的登录过程不完整。必须传递所有输入元素(包括隐藏元素)及其值。如果不这样做,您将被重定向到同一个登录页面,一次又一次。顺便说一句,您需要:
CookieContainer CookieContainer=new CookieContainer()声明为字段,在登录过程之外,否则在调用之间不会保留cookie。目前还不清楚该声明属于何处。