live.com에 로그인 할 응용 프로그램을 작성 중입니다. 이미 WebBrowser 컨트롤을 사용하여이 기능을 성공적으로 구현했지만 현재 헤드리스 브라우저로이 작업을 수행하려고합니다. SimpleBrowser 만 사용 하겠지만 JavaScript 지원이 필요합니다. 그래서 쿠키를 지원하기 위해 WebClient 클래스를 확장하여이 작업을 수행하려고합니다. 나는 원래 그것이 내 문제라고 생각했지만 HttpWebRequest와 HttpWebResponse 객체를 사용하여 간단한 쿠키 테스트를 수행하여 쿠키가 어떻게 보이는지를 보았습니다. 동일한 결과가 나타났습니다.버전이 응답으로 지정된 경우 CookieContainer 개체의 예기치 않은 동작 Set-Cookie C# .NET 2.0-4.0
문제는 live.com의 Set-Cookie 응답 헤더에 "version = 1"이 전달 된 것으로 보입니다. 내 테스트 케이스의 경우 twitter.com과 login.live.com에 대해 동일한 코드를 실행했습니다.
private void printCookies(string url)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); ;
CookieContainer cc = new CookieContainer();
req.CookieContainer = cc;
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
if (res.Cookies != null && res.Cookies.Count != 0)
{
Console.WriteLine("--------" + url + "--------");
foreach (Cookie c in res.Cookies)
{
Console.WriteLine(c.ToString());
}
}
res.Close();
}
출력 :
--------https://login.live.com--------
$Version=1; MSPRequ=lt=1309969317&co=1&id=251248; $Path=/
--------http://twitter.com--------
k=209.43.1.25.1309969317382762
guest_id=v1%3A130996931741841563
auth_token= _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCC5%252BQQAxAToHaWQiJWNmZWM0ZTAyNmEyMWYx%250ANDg0MTM3YzJhZGRiZTljYmI2IgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--e08b33494bd0d4d688020d4c875f69a1192e2a84
내가 각각의 URL의의 응답 헤더의 "설정 - 쿠키를"값을 보면, 이것이 내가 (피들러에서 잡고)를 참조하십시오 것입니다 :
login.live.com
Set-Cookie: MSPRequ=lt=1309969336&co=1&id=251248; path=/;version=1
Set-Cookie: MSPOK=$uuid-9f7c6cd2-5acc-497f-a634-079d78cb6e7f; domain=login.live.com;path=/;version=1
twitter.com
Set-Cookie: k=209.43.1.25.1309969337110139; path=/; expires=Wed, 13-Jul-11 16:22:17 GMT; domain=.twitter.com
Set-Cookie: guest_id=v1%3A130996933711260520; domain=.twitter.com; path=/; expires=Sat, 06 Jul 2013 04:22:17 GMT
Set-Cookie: auth_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: auth_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCBrLQQAxAToHaWQiJTZhZTNjNmRmNjlhNWJl%250AMWEyMzkyZjNjNWQ4MjRmNDAxIgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--2af4da7176dc0ee77c8379bc31a85c0301823e2d; domain=.twitter.com; path=/; HttpOnly
그래서 login.live.com은 쿠키 중 하나만 잡아서 버전과 경로를 별도로 저장합니다. twitter.com 요청이 예상대로 작동합니다 (왜 중복 auth_token이 전송되었지만 CookieContainer가이를 잘 처리하는지 확실하지 않음).
이것은 예상되는 동작입니까? IE, Firefox 및 Chrome은 "버전 = 1"(Fiddler에서 내가 알 수있는 것)을 무시한 것처럼 보입니다. 내 사용자 지정 WebClient 클래스의 GetWebResponse 메서드를 재정 의하여 응답 헤더의 "Set-Cookie"값에서 "version = 1"을 제거 할 수 있지만 더 확실한 해결책이 없기를 바랐습니다. 그것은 아마도 "버전 = 1"의 결함이 아니지만 두 개의 테스트 케이스 사이에 다른 현저한 차이점을 보지 못합니다.
감사합니다,
는 웹 브라우저 구성 요소를 사용하지 않는 이유 무엇입니까 (HttpWebRequest 및 HttpWebResponse로 처리 할 때 시간 소모)가 피들러에서 보이는 것처럼 live.com에 연결할 때 진행됩니까? – cgon
WebBrowser 개체는 Forms 컨트롤입니다. 기본적으로 MSHTML의 래퍼입니다. HTML 렌더링에 대해 걱정하지 않는 헤드리스 솔루션을 구현하고 싶습니다. 그리고 원시 데이터를 잡아 보내거나 보냅니다. 또한 WPF로 구현하려고 시도하고 있으며 Forms WebBrowser와 Forms WebBrowser가 마음에 들지 않아 Forms 호스트에서 실행 중입니다. –
지연은 아마도 HttpRequest.Proxy 설정의 프록시 때문일 것입니다. 끄면 Fiddler에는 아무 것도 표시되지 않지만 연결 속도는 빨라집니다. 그럼에도 불구하고 여기 내 문제는이 "해야한다"는 것이지만 그렇지 않다는 것이다. CookieContainer 처리 버전에 고유 한 문제가 있거나 내 구현에 문제가있는 것 같습니다. –