Как запросить данные с защищенного паролем сайта https - PullRequest
0 голосов
/ 15 апреля 2010

Я бы хотел, чтобы мое приложение запрашивало CSV-файл с защищенного веб-сайта. У меня нет опыта работы с веб-программированием, поэтому я буду признателен за подробные инструкции. В настоящее время у меня есть логин пользователя на сайт, вручную запрос к CSV, и мое приложение загружает файл локально. Я хотел бы автоматизировать это, попросив пользователя ввести свои данные для входа, аутентифицировать его на веб-сайте и запросить данные. Приложение написано на C # .NET.

Я уже протестировал следующий код и могу получить доступ к файлу, когда пользователь уже аутентифицировал себя и создал запрос вручную.

        System.Net.WebClient Client = new WebClient();
        Stream strm = Client.OpenRead("https://<URL>/file.csv");

Вот запрос, отправленный на сайт для аутентификации. Я заключил в скобки настоящий идентификатор пользователя и пароль.

POST /pwdVal.asp HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; Tablet PC 2.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Cookie: ASPSESSIONID<unsure if this data contained password info so removed>; ClientId=<username>
Host: www3.emidas.com
Content-Length: 36
Connection: Keep-Alive
Cache-Control: no-cache
Accept-Language: en-US

client_id=<username>&password=<password>

Ответы [ 3 ]

1 голос
/ 15 апреля 2010

Скорее всего, сервер отправляет куки после входа в систему. Вам необходимо отправить те же значения, что и в форме входа. (это можно сделать с помощью UploadValues ​​()) Однако вам необходимо сохранить полученные куки в CookieContainer .

Когда я сделал это, я сделал это с помощью HttpWebRequest, однако для http://couldbedone.blogspot.com/2007/08/webclient-handling-cookies.html вы можете создать подкласс WebClient и переопределить метод GetWebRequest (), чтобы он поддерживал cookie.

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

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

    private CookieContainer _jar = new CookieContainer();
    private string _password;
    private string _userid;
    private string _url;
    private string _userAgent;

...

        string responseData;

        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(_url);

        webRequest.CookieContainer = _jar;
        webRequest.Method = "POST";
        webRequest.ContentType = "application/x-www-form-urlencoded";
        webRequest.UserAgent = _userAgent;

        string requestBody = String.Format(
            "client_id={0}&password={1}", _userid, _password);

        try
        {
            using (StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream()))
            {

                requestWriter.Write(requestBody);
                requestWriter.Close();

                using (HttpWebResponse res = (HttpWebResponse)webRequest.GetResponse())
                {
                    using (StreamReader responseReader = new StreamReader(res.GetResponseStream()))
                    {

                        responseData = responseReader.ReadToEnd();
                        responseReader.Close();

                        if (res.StatusCode != HttpStatusCode.OK)
                            throw new WebException("Logon failed", null, WebExceptionStatus.Success, res);
                    }

                }
            }
0 голосов
/ 21 апреля 2010

Другой способ сделать это - автоматизировать IE, например, использовать элемент управления WebBrowser. Это будет более точно имитировать все умные вещи, которые IE делает, например, запуск Javascript, что может быть необходимо. Хотя, если Javascript или другие умные вещи не нужны, то использование IE немного сложное и, возможно, склонно к другим проблемам.

0 голосов
/ 15 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...