Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WebView - Define User-Agent on every request

Currently, I am setting the User-Agent of a request message as follows:

var rm = new HttpRequestMessage(HttpMethod.Post, new Uri("http://example.com"));       
rm.Headers.Add("User-Agent", "UserAgentString");
webView.NavigateWithHttpRequestMessage(rm);

Everything works as expected.

But, when I am navigating to an another page, by clicking a link on the site for example, the User-Agent resets to the default of the WebView.

Is there any way of setting the User-Agent permanently or changing it on every request made?

Thanks, George

like image 467
George Chondrompilas Avatar asked Mar 07 '16 23:03

George Chondrompilas


1 Answers

I found this trick by Matt Dot. This will permanently change the user-agent string. Any WebView request, whether manual or through a link-click inside the HTML, will have your value sent as the User-Agent header.

Here's the source in case the link dies.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace UA
{
    public static class UserAgent
    {
        const int URLMON_OPTION_USERAGENT = 0x10000001;

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

        [DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
        private static extern int UrlMkGetSessionOption(int dwOption, StringBuilder pBuffer, int dwBufferLength, ref int pdwBufferLength, int dwReserved);

        public static string GetUserAgent()
        {
            int capacity = 255;
            var buf = new StringBuilder(capacity);
            int length = 0;

            UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, buf, capacity, ref length, 0);

            return buf.ToString();
        }

        public static void SetUserAgent(string agent)
        {
            var hr = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, agent, agent.Length, 0);
            var ex = Marshal.GetExceptionForHR(hr);
            if(null != ex)
            {
                throw ex;
            }
        }

        public static void AppendUserAgent(string suffix)
        {
            SetUserAgent(GetUserAgent() + suffix);
        }
    }
}

You can change this value anywhere in your app, but if you want it permanently set, use the App.xaml.cs constructor:

public App()
{
    UA.UserAgent.SetUserAgent("Firefox ;)");

    // ...
}
like image 189
Laith Avatar answered Oct 29 '22 13:10

Laith