Как я могу читать XML на C# с другой страницы, войдя на сайт?

StackOverflow https://stackoverflow.com/questions/1079233

Вопрос

Я вошел на сайт с помощью веб-браузера, и каждый раз, когда я пытаюсь позвонить

WebClient myWebClient = new WebClient();
string str = myWebClient.DownloadString("http://localhost/myxml.aspx");
Response.Write(str.ToString());

Или

XmlTextReader reader = new XmlTextReader(url);
while (reader.Read()) {
 Response.Write(reader.ReadOuterXml());
} 

Response.Write возвращает мне страницу входа.

Можно ли прикрепить идентификатор сеанса пользователя к WebClient или XmlTextReader или как я могу запросить другую страницу на С# с текущим вошедшим в систему пользователем?

Это было полезно?

Решение

Вам нужно будет использовать объект, который может обрабатывать хранение файлов cookie.В этом случае вам понадобится HttpWebRequest сорт.Вам также понадобится CookieContainer для управления файлами cookie аутентификации.

Для этого вам необходимо:

  1. Создать CookieContainer объект (банка файлов cookie), который вы можете отслеживать на протяжении всего вашего запроса.
  2. Создать HttpWebRequest который входит на сайт, к которому вы обращаетесь.
  3. Использовать CookieContainer вы создали на шаге 1 для каждого последующего запроса.

Ниже приведен пример использования HttpWebRequest, HttpWebResponse, и CookieContainer классы вместе, чтобы сделать простой запрос, который установит некоторые файлы cookie, а затем использовать эти файлы cookie при последующем запросе.Остальное должно быть легко, если все в разметке правильно сформировано;)

CookieContainer cookieJar = new CookieContainer();

var webRequest = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com");
webRequest.CookieContainer = cookieJar;

var webResponse = webRequest.GetResponse();

using (var reader = new StreamReader(webResponse.GetResponseStream()))
{
    Response.Write(reader.ReadToEnd());
}

var anotherWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com/search?q=stackoverflow.com");
anotherWebRequest.CookieContainer = cookieJar;

webResponse = anotherWebRequest.GetResponse();

Другой вариант (если вы действительно хотите использовать WebClient class) будет анализировать ResponseHeaders свойство класса после того, как вы сделали запрос, и включите соответствующие файлы cookie в свой следующий запрос.Однако это немного сложнее, поскольку вам необходимо вручную управлять файлами cookie.

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

Другие советы

Когда я делал очистку экрана, у меня возникла та же проблема.Я запрашивал приложение Classic ASP на сервере IIS (по некоторым заголовкам я мог сказать, что сервер ответил).Я поддерживал текущий сеанс, включив файлы cookie в веб-клиенте.Для этого нет переключателя, вам нужно создать подкласс WebClient, чтобы он работал.

    public class CookieAwareWebClient : WebClient
    {
        protected CookieContainer _container = new CookieContainer();

        public CookieContainer Cookies
        {
            get { return _container; }
            set { _container = value; }
        }

        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest httpRequest = base.GetWebRequest(address) as HttpWebRequest;      

            if (httpRequest.CookieContainer != null)
            {
                if (httpRequest != null)
                {
                    CookieCollection newCookies = 
                        GetUniqueCookies(
                                address
                                ,httpRequest.CookieContainer.GetCookies(address)
                                );
                    foreach (Cookie c in newCookies)
                        httpRequest.CookieContainer.Add(c);
                }
            }
            else
                httpRequest.CookieContainer = this.Cookies;

            return (WebRequest)httpRequest;
        }

Примечание:это не уникальное решение, я сам нашел его в Интернете, но я реализовал это решение, и оно работает очень хорошо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top