사이트에 로그인 한 상태에서 다른 페이지에서 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 로그인 페이지를 반환합니다.

사용자 sessessID를 WebClient 또는 XmlTexTreader에 첨부 할 수 있습니까?

도움이 되었습니까?

해결책

쿠키 저장을 처리 할 수있는 물체를 사용해야합니다. 이 경우 필요합니다 HttpWebRequest 수업. 당신은 또한 필요합니다 CookieContainer 인증 쿠키를 관리합니다.

이렇게하려면 다음과 같습니다.

  1. a CookieContainer 모든 요청의 범위를 추적 할 수있는 물체 (쿠키 항아리).
  2. 생성 HttpWebRequest 액세스하는 사이트에 로그인합니다.
  3. 사용 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;
        }

참고 : 이것은 독특한 솔루션이 아니며 웹에서 직접 찾았지만 솔루션을 구현했으며 실제로 잘 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top