2014-06-16 3 views
5

"before navigation"- 이벤트의 헤더를 수정하여 WatiN 프레임 워크를 사용하여 사용자 에이전트 문자열을 변경하려고합니다. 나는 정말 솔루션에 가깝다고 생각하지만 몇 가지 이유로 URL을 잠깐 방문한 후 아래 코드로 빈 페이지로 리디렉션됩니다.WatiN 브라우저의 Custom BeforeNavigate-event

사용자 정의 BeforeNavigate 이벤트를 주석 처리하면 브라우저가 빈 페이지로 리디렉션되지 않으므로 사용자 정의 이벤트를 약간 수정해야한다고 생각합니다. 문제가 무엇인지 아이디어가 있습니까?

이 문제를 재현 WatiN를 다운로드하고 아래의 코드를 실행하려면 :

private SHDocVw.InternetExplorerClass _ieInstance; 

private const string UserAgent = 
    "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)" + 
    "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153" + 
    "Safari/537.36\r\n"; 

bool _renavigating; 
private IE _browser; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    _ieInstance = _ieInstance = new SHDocVw.InternetExplorerClass(); 
    //_ieInstance.BeforeNavigate2 += BeforeNavigate; 
    _browser = new IE(_ieInstance); 
    _browser.GoTo("http://www.procato.com/my+headers/"); 
} 

void BeforeNavigate(object pDisp, ref object url, ref object flags, 
    ref object targetFrameName, ref object postData, ref object headers, 
    ref bool cancel) 
{ 
    if (!string.IsNullOrEmpty(UserAgent)) 
    { 
     if (!_renavigating) 
     { 
      headers += string.Format("User-Agent: {0}\r\n", UserAgent); 
      _renavigating = true; 
      cancel = true; 
      _ieInstance.Navigate((string)url, 
       (string)targetFrameName, (byte[])postData, (string)headers); 
     } 
     else 
     { 
      _renavigating = false; 
     } 
    } 
} 

Noseratio의 제안뿐만 아니라 나에게 빈 페이지를 제공 @ :

readonly SynchronizationContext _sc = SynchronizationContext.Current; 

void BeforeNavigate(object pDisp, ref object url, ref object flags, 
    ref object targetFrameName, ref object postData, ref object headers, 
    ref bool cancel) 
{ 
    if (!string.IsNullOrEmpty(UserAgent)) 
    { 
     if (!_renavigating) 
     { 
      var newHeaders = string.Format("User-Agent: {0}\r\n", UserAgent); 
      _renavigating = true; 
      cancel = true; 

      string thatUrl = (string)url; 
      object thatFlags = flags; 
      object thatTargetFrameName = targetFrameName; 
      object thatPostData = postData; 
      object thatHeaders = (headers != null && headers != Type.Missing && 
           headers != System.DBNull.Value) ? 
       (headers.ToString() + newHeaders) : newHeaders; 

      _sc.Post(_ => 
      { 
       ((SHDocVw.IWebBrowser)pDisp).Navigate(
        thatUrl, 
        ref thatFlags, 
        ref thatTargetFrameName, 
        ref thatPostData, 
        ref thatHeaders); 
      }, null); 
     } 
     else 
     { 
      _renavigating = false; 
     } 
    } 
} 
+0

모든 요청에 ​​대해 사용자 에이전트를 변경해야합니까, 아니면 페이지에 대한 직접 탐색 요청만으로 충분합니까? 또한 단일 테스트/프로세스 내에서 여러 번 여러 가지 사항을 변경해야합니까? –

+0

@BenAaronson 죄송합니다. 어떤 이유로 든이 알림을받지 못했습니다. 페이지로 이동하는 요청이면 충분합니다. 그렇습니다. 각 IE 인스턴스는 자체 헤더를 가질 수 있어야합니다. – Johan

답변

0

요청 탐색을 페이지에 충분하다. 이 경우

, 나는 BeforeNavigate2 죽겠다, 단순히 이동 _ieInstance.Navigate를 사용하여 당신의 생활을 간단하게 건의 할 것입니다. 예컨대 :

private void Form1_Load(object sender, EventArgs e) 
{ 
    _ieInstance = _ieInstance = new SHDocVw.InternetExplorerClass(); 
    _browser = new IE(_ieInstance); 
    _ieInstance.Navigate("http://www.procato.com/my+headers/", Headers: UserAgent); 
} 

로딩 페이지가 추가 요청을 만들기 때문에 잘못된 헤더 될 것 procato에 표시되는 결과, 그 오른쪽 헤더를 필요가 없습니다. 그러나 Fiddler2와 같은 도구를 사용하면 초기 요청에 올바른 사용자 에이전트 헤더가 있음을 알 수 있습니다.