サイトにログインしているときに別のページから C# XML を読み取るにはどうすればよいですか

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 はログイン ページを返します。

ユーザーの SessionId を WebClient または XmlTextReader にアタッチする方法はありますか、または現在ログインしているユーザーで C# で別のページをリクエストするにはどうすればよいですか?

役に立ちましたか?

解決

Cookie の保存を処理できるオブジェクトを使用する必要があります。この場合、必要となるのは、 HttpWebRequest クラス。また、 CookieContainer 認証クッキーを管理します。

これを行うには、次のようにします。

  1. を作成します CookieContainer オブジェクト (Cookie jar) を作成し、すべてのリクエストの範囲全体にわたって追跡できます。
  2. を作成します HttpWebRequest アクセスしているサイトにログインします。
  3. 使用 CookieContainer 後続のリクエストごとにステップ 1 で作成したもの。

以下は使用方法の例です HttpWebRequest, HttpWebResponse, 、 そして クッキーコンテナ クラスを組み合わせていくつかの 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 クラス)を解析することになります ResponseHeaders リクエストを行ったらクラスのプロパティを変更し、次のリクエストに適切な Cookie を含めます。ただし、Cookie を手動で管理する必要があるため、これは少し複雑です。

Web 応答を XML としてトラバースできるようにしたいと考えているため、オープンソース ライブラリを検討することをお勧めします。 HTMLアジリティパック. 。これを使用すると、(おそらく) 整形式ではない、または何らかの無効なマークアップが含まれる Web サイトからマークアップを送信し、無効な部分を修正して、XML のようにスキャンできるようにします。

他のヒント

一部のスクリーン・スクレイピングをやっている間、私は同じ問題がありました。私は、IISサーバー上のクラシックASPアプリを要求された(私は、サーバーがでrepondedヘッダーの一部によって言うことができます)。私は進行中のセッションをサポートする方法は、Webクライアント上のクッキーを有効にしていました。あなたはそれが仕事を得るためにWebクライアントをサブクラス化する必要があり、そのためのトグルをtheresの。

    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