WebView - user agent definition for each request

I am currently installing User-Agent request messages 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 go to another page, for example, by clicking on the link on the site, the User-Agent resets the default WebView .

Is there a way to install User-Agent permanently or change it for every request made?

Thanks George

+6
source share
3 answers

The only way I was able to get this working reliably enough was to use the NavigationStarting event to cancel the page load and retrieve the current URL, and then use the custom event to start a new page load with the correct UA.

 public sealed partial class MainPage : Page { private bool headerSent; private Uri uri; private delegate void NavigateHandler(object sender, EventArgs e); private event NavigateHandler OnNavigate; public MainPage() { this.InitializeComponent(); this.OnNavigate += new NavigateHandler(Navigate); this.headerSent = false; this.webview.Navigate(new Uri("https://netflix.com")); } private void Navigate(object sender, EventArgs e) { this.headerSent = true; var rm = new HttpRequestMessage(HttpMethod.Post, this.uri); rm.Headers.Add("User-Agent", @"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136"); this.webview.NavigateWithHttpRequestMessage(rm); } private void webview_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args) { if (!headerSent) { args.Cancel = true; this.uri = args.Uri; OnNavigate(this, new EventArgs()); } else if (headerSent) { headerSent = false; } } } 

Not really, but it seems to work.

+2
source

NavigationStarting happens before web browsing moves to new content. You can cancel this operation by getting args.Uri and navigate using HttpRequestMessage . There is also FrameNavigationStarting .

 WebView wb = new WebView(); wb.NavigationStarting += A_NavigationStarting; private void A_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args) { //this will throw `StackOverflowException` so you have to add a condition here if(handled) { args.Cancel = true; var rm = new HttpRequestMessage(HttpMethod.Post, args.Uri); rm.Headers.Add("User-Agent", "UserAgentString"); sender.NavigateWithHttpRequestMessage(rm); } } 
+1
source

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

Here is 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 application, but if you want it to be installed forever, use the App.xaml.cs constructor:

 public App() { UA.UserAgent.SetUserAgent("Firefox ;)"); // ... } 
0
source

All Articles