Вход на веб-сайт через C#, переход на другую веб-страницу, а затем вывод исходного кода в виде строки

Я относительно новичок в работе с веб-страницами на C#. То, что я пытаюсь сделать, это войти в определенный веб-сайт (https://www15.swalife.com/PortalWeb/portal/cwaLogon.jsp) и позволяет перенаправить страницу на страницу по умолчанию, а затем перейти оттуда к (https://www15.swalife.com/csswa/ea/plt/accessELITT.do) и загрузка исходного кода и вывод его в строку.

я выяснил, как загрузить исходный код через HTTPWebRequest и HTTPWebResponse, но у меня возникли проблемы с кодированием функции входа в систему. Я предполагаю, что мне придется что-то делать с постом? Я посмотрел на http://www.dreamincode.net/forums/topic/152297-c%23-log-in-to-website-programmatically/ также.

спасибо заранее!!

EDIT:

код, предоставляемый jimmyjambles работает безотказно, разве это не достаточно дать мне исходный код страницы я хотел. Код предполагает, что процесс входа в систему не удалось, но я считаю, что с небольшой настройкой я мог бы заставить его работать...также всем, у кого есть проблемы с:

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(AcceptAllCertifications);

попробуйте изменить функции" public string "и" public bool "на" public static string "и" public static bool " соответственно:)

EDIT 2:

ответ HTML:

"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">n<HTML>n<HEAD>nnnnnnn<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">n<META name="GENERATOR" content="IBM WebSphere Studio">n<TITLE>endSession.jsp</TITLE>n<LINK rel="stylesheet" href="eipPortletStyles/swalife.css" type="text/css">nt<script type="text/javascript" language="JavaScript" nttsrc="eipCommonJavaScript/eipGeneralFunctions.js"/> </script>nttn<script type="text/javascript">nntfunction refreshParent()nt{nt    if(window.parent)nt    {nt    if(window.parent.name == 'appMainFrame')nt       window.parent.location = "/csswa/ea/plt/logout.do";nt    //  alert('Your session has expired.  Please login again. ');nt    }nt}nn</script>n</HEAD>n<BODY onload="refreshParent();">n nt t<div class="eipErrors">n  ttt<div class="legendLabel">Message</div>n  tttn  ttt    <div class="errorsHeader formTitle">You Have Exited Out of Crew Web Access.<br>  ttt n  ttt    </div>n  ttt n  ttt<div class="errorsHeader formTitle"> Please Close this Window and <font  size="+1">Log Out of SWALife</font> to Complete the Log Out Process.  </div>n  tt<div class="errorsText">n  tt  &nbsp;n  ttttn  tt</div>n  ttn  tttn  ttn  tt<div class="errorsFooter">You will need to log back in before continuing.</div>  tn  ttn t</div>n  n</BODY>n</HTML>n"

2 ответов


чтобы использовать HttpWebRequest для доступа к вторичному URL-адресу после входа в систему, вам нужно будет иметь в виду несколько вещей.

во-первых, как упоминал Каспера, вам нужно будет проверить форму входа в систему и определить атрибут "имя" элементов управления, используемых для получения данных входа в систему.

как только вы это сделаете, вам нужно будет отформатировать строку post соответственно и предоставить ее WebRequest.

последнее соображение заключается в том, что после входа в систему вы необходимо будет хранить и поддерживать куки, назначенные вам с сервера, который держит вас вошли в систему.

Я взял фрагмент WebRequest из эта статья msdn и изменил его, чтобы выполнить второй запрос страницы после входа в систему.

        string loginurl = "http://www.gmail.com";
        string secondurl = "http://mail.google.com/prefs";

        string username = "bob@gmail.com";
        string password = "12345";
        GetSecondaryLoginPage(loginurl, secondurl, username, password);



    public string GetSecondaryLoginPage(string loginurl, string secondurl, string username, string password, string cookieName = null)
    {
        // Create a request using a URL that can receive a post. 
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginurl);
        // Set the Method property of the request to POST.
        request.Method = "POST";

        CookieContainer container = new CookieContainer();

        if (cookieName != null)
            container.Add(new Cookie(cookieName, username, "/", new Uri(loginurl).Host));

        request.CookieContainer = container;

        // Create POST data and convert it to a byte array.  Modify this line accordingly
        string postData = String.Format("username={0}&password={1}", username, password);

        ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        // Set the ContentType property of the WebRequest.
        request.ContentType = "application/x-www-form-urlencoded";
        // Set the ContentLength property of the WebRequest.
        request.ContentLength = byteArray.Length;
        // Get the request stream.
        Stream dataStream = request.GetRequestStream();
        // Write the data to the request stream.
        dataStream.Write(byteArray, 0, byteArray.Length);
        // Close the Stream object.
        dataStream.Close();
        // Get the response.
        WebResponse response = request.GetResponse();
        // Get the stream containing content returned by the server.
        dataStream = response.GetResponseStream();
        // Open the stream using a StreamReader for easy access.
        StreamReader reader = new StreamReader(dataStream);
        // Read the content.
        string responseFromServer = reader.ReadToEnd();

        using (StreamWriter outfile =
        new StreamWriter("output.html"))
        {
            outfile.Write(responseFromServer.ToString());
        }

        // Clean up the streams.
        reader.Close();
        dataStream.Close();
        response.Close();

        request = (HttpWebRequest)WebRequest.Create(secondurl);
        request.CookieContainer = container;

        response = request.GetResponse();
        // Get the stream containing content returned by the server.
        dataStream = response.GetResponseStream();
        // Open the stream using a StreamReader for easy access.
        reader = new StreamReader(dataStream);
        // Read the content.
        responseFromServer = reader.ReadToEnd();

        // Clean up the streams.
        reader.Close();
        dataStream.Close();
        response.Close();

        return responseFromServer;
    }


    public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }

добавлены только строки для postData и cookies.

вам нужно будет изменить строку

string postData = String.Format("username={0}&password={1}", username, password);

на основе ваших элементов управления в форме, так как вы выложили свой сайт пытаюсь работа с я могу догадаться, что вы, вероятно, ищете

string postData = String.Format("uid={0}&portalBase=cwa&password={1}", username, password);

использование WebBrowser в форме довольно легко. Начните с перехода к cwaLogon.страница jsp и найдите элементы управления вводом и вызовите "click" на кнопке отправки. Либо это, либо сделайте соответствующие GET/POSTs, используя HTTPWebRequest и Response. Использование Fiddler2 для проверки того, что публиковать, - отличное начало.