サイトにログインしているときに別のページから C# XML を読み取るにはどうすればよいですか
-
21-08-2019 - |
質問
ウェブブラウザでサイトにログインしており、電話をかけようとするたびに
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
認証クッキーを管理します。
これを行うには、次のようにします。
- を作成します
CookieContainer
オブジェクト (Cookie jar) を作成し、すべてのリクエストの範囲全体にわたって追跡できます。 - を作成します
HttpWebRequest
アクセスしているサイトにログインします。 - 使用
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;
}
注:これはユニークなソリューションではありません、私はウェブ上でそこに自分自身をこれを見つけたが、私は解決策を実装しましたし、それは本当によく働きます。