0

ウェブブラウザでサイトにログインし、電話をかけようとするたびに

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# で別のページを要求するにはどうすればよいですか?

4

2 に答える 2

1

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

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

  1. 作成するCookieContainerすべてのリクエストのスコープ全体で追跡できるオブジェクト (Cookie jar) を作成します。
  2. HttpWebRequestアクセスしているサイトにログインする を作成します。
  3. CookieContainer以降のすべてのリクエストに対して、ステップ 1 で作成した を使用します。

以下は、HttpWebRequestHttpWebResponse、および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クラスを使用したい場合) は、リクエストを行った後にクラスのプロパティを解析し、ResponseHeaders次のリクエストに適切な Cookie を含めることです。ただし、Cookie を手動で管理する必要があるため、これは少し複雑です。

Web 応答を XML としてトラバースできるようにしたいと考えているので、オープン ソース ライブラリのHtmlAgilityPackを調べることをお勧めします。これを使用すると、(ほとんどの場合) 整形式でない Web サイト、または何らかの無効なマークアップが含まれている Web サイトからマークアップを送信し、無効な部分を修正して、XML のようにトラバースできるようにすることができます。

于 2009-07-03T13:12:05.150 に答える
1

画面のスクレイピングを行っているときに、同じ問題が発生しました。IIS サーバーでクラシック ASP アプリを要求していました (サーバーが応答したいくつかのヘッダーでわかりました)。進行中のセッションをサポートする方法は、WebClient で 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;
        }

注: これは独自の解決策ではありません。私は自分で Web でこれを見つけましたが、解決策を実装したところ、非常にうまく機能します。

于 2009-07-03T13:14:08.110 に答える