사이트에 로그인 한 상태에서 다른 페이지에서 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 로그인 페이지를 반환합니다.
사용자 sessessID를 WebClient 또는 XmlTexTreader에 첨부 할 수 있습니까?
해결책
쿠키 저장을 처리 할 수있는 물체를 사용해야합니다. 이 경우 필요합니다 HttpWebRequest
수업. 당신은 또한 필요합니다 CookieContainer
인증 쿠키를 관리합니다.
이렇게하려면 다음과 같습니다.
- a
CookieContainer
모든 요청의 범위를 추적 할 수있는 물체 (쿠키 항아리). - 생성
HttpWebRequest
액세스하는 사이트에 로그인합니다. - 사용
CookieContainer
모든 후속 요청에 대해 1 단계에서 생성했습니다.
아래는 사용 방법의 예입니다 httpwebrequest, httpwebresponse, 그리고 CookieContainer 수업을 통해 일부 쿠키를 설정 한 간단한 요청을 한 다음 후속 요청에 해당 쿠키를 사용합니다. 나머지는 모든 것이 잘 형성되었다고 가정 할 때 쉽게해야합니다.)
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
클래스의 자산 요청을 한 후에 다음 요청에 적절한 쿠키를 포함 시키면. 쿠키를 수동으로 관리해야하므로 조금 더 관여합니다.
웹 응답을 XML로 통과 할 수 있다고 가정하기 때문에 오픈 소스 라이브러리를 살펴 보는 것이 좋습니다. htmlagilitypack. 이를 통해 (대부분)가 잘 형성되지 않았거나 유효하지 않은 마크 업이있는 웹 사이트에서 마크 업을 보낼 수 있습니다. 그런 다음 유효하지 않은 부품을 수정하여 XML처럼 이동할 수 있습니다.
다른 팁
약간의 화면 스크래핑을하는 동안 나는 같은 문제가있었습니다. IIS 서버에서 클래식 ASP 앱을 요청하고있었습니다 (서버가 reponded 한 일부 헤더에서 알 수 있음). 진행중인 세션을 지원하는 방식은 웹 클라이언트에서 쿠키를 활성화하는 것입니다. 토글이 없으면 웹 클라이언트를 서브 클래스로 만들어야합니다.
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;
}
참고 : 이것은 독특한 솔루션이 아니며 웹에서 직접 찾았지만 솔루션을 구현했으며 실제로 잘 작동합니다.