문제

Winforms 응용 프로그램에서 Webbrowser 컨트롤의 사용자 가건을 변경하려고합니다.

다음 코드를 사용하여이를 성공적으로 달성했습니다.

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(
    int dwOption, string pBuffer, int dwBufferLength, int dwReserved);

const int URLMON_OPTION_USERAGENT = 0x10000001;

public void ChangeUserAgent()
{
    List<string> userAgent = new List<string>();
    string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";

    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
}

유일한 문제는 이것이 한 번만 작동한다는 것입니다. changeuseragent () 메소드를 두 번째로 실행하려고 할 때 작동하지 않습니다. 처음으로 변경된 값으로 설정되어 있습니다. 이것은 꽤 성가신 일이며 모든 것을 시도했지만 두 번 이상 변경되지는 않습니다.

다른 사람이 다르고 유연한 접근 방식을 아는 사람이 있습니까?

감사

도움이 되었습니까?

해결책

내가 단지 복사/붙여 넣어야하는지 확실하지 않습니다. 웹 사이트, 그러나 링크 대신 여기에 답을 남겨두고 싶습니다. 누구든지 의견을 명확히 할 수 있다면 많은 의무가 있습니다.

기본적으로 Webbrowser 클래스를 확장해야합니다.

public class ExtendedWebBrowser : WebBrowser
{
    bool renavigating = false;

    public string UserAgent { get; set; }

    public ExtendedWebBrowser()
    {
        DocumentCompleted += SetupBrowser;

        //this will cause SetupBrowser to run (we need a document object)
        Navigate("about:blank");
    }

    void SetupBrowser(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        DocumentCompleted -= SetupBrowser;
        SHDocVw.WebBrowser xBrowser = (SHDocVw.WebBrowser)ActiveXInstance;
        xBrowser.BeforeNavigate2 += BeforeNavigate;
        DocumentCompleted += PageLoaded;
    }

    void PageLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

    }

    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;
                Navigate((string)url, (string)targetFrameName, (byte[])postData, (string)headers);
            }
            else
            {
                renavigating = false;
            }
        }
    }
}

참고 : 위의 방법을 사용하려면 "Microsoft 인터넷 컨트롤"에 대한 COM 참조를 추가해야합니다.

그는 귀하의 접근 방식도 언급하고 Webbrowser 컨트롤 이이 사용자 에이전트 문자열을 캐시하는 것처럼 보이므로 프로세스를 다시 시작하지 않고 사용자 에이전트를 변경하지 않을 것입니다.

다른 팁

가장 쉬운 방법 :

webBrowser.Navigate("http://localhost/run.php", null, null,
                    "User-Agent: Here Put The User Agent");

또한 함수에는 새로 고침 옵션이 있습니다 (에 따라 MSDN). 그것은 나에게 잘 작동했습니다 (사용자 에이전트 변경 전에 설정해야합니다). 그런 다음 질문 코드를 다음과 같이 변경할 수 있습니다.

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(
    int dwOption, string pBuffer, int dwBufferLength, int dwReserved);

const int URLMON_OPTION_USERAGENT = 0x10000001;
const int URLMON_OPTION_USERAGENT_REFRESH = 0x10000002;

public void ChangeUserAgent()
{
    string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";

    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT_REFRESH, null, 0, 0);
    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
}

@jean azzopardi의 대답에 추가하고 싶습니다.

void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,
        ref object postData, ref object headers, ref bool cancel)
{
    // This alone is sufficient, because headers is a "Ref" parameters, and the browser seems to pick this back up.
    headers += string.Format("User-Agent: {0}\r\n", UserAgent);
}

이 솔루션은 저에게 가장 잘 작동했습니다. 렌 변수를 사용하면 브라우저 콘텐츠가 갑자기 사라지고 때로는 여전히 지원되지 않는 브라우저와 같은 다른 이상한 문제가 발생했습니다. 이 기술을 통해 Fiddler의 모든 요청에는 올바른 사용자 에이전트가있었습니다.

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