5

Derzeit bin ich der User-Agent einer Anforderungsnachricht Einstellung wie folgt:WebView - Definieren User-Agent bei jeder Anfrage

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

Alles funktioniert wie erwartet.

Wenn ich jedoch zu einer anderen Seite navigiere, indem ich beispielsweise auf einen Link auf der Website klicke, wird der Benutzer-Agent auf den Standardwert WebView zurückgesetzt.

Gibt es einen Weg, um die User-Agent der Einstellung permanent oder auf jeder Antrag zu ändern?

Danke, George

+0

[Ich glaube nicht, können Sie] (https: // social.msdn.microsoft.com/Forums/en-US/ea00647f-ba00-45a0-8df0-fa267f073ab9/set-webview-user-agent-string?forum=winappswithcsharp). – DavidG

+0

@DavidG Vielen Dank für Ihren Kommentar, aber dies ist für Windows 8. Ich kann den User-Agent auf erste Anfrage als MAYBreath auf MSDN erwähnt ändern, aber es ändert sich standardmäßig, wenn ich auf eine andere Seite navigiere. – GeorgeChond

+0

Ja, ich weiß, dass Windows 8 noch gültig ist. – DavidG

Antwort

1

NavigationStarting auftritt, bevor die Webansicht auf neue Inhalte navigiert. Sie können diesen Vorgang abbrechen, indem Sie args.Uri aufrufen und mit HttpRequestMessage navigieren. Es gibt auch 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); 
    } 
} 
+0

Danke für deine Antwort Stamatis! Aber das wird "StackOverflowException" auslösen, da es die Navigation immer startet und abbricht. – GeorgeChond

+0

Dann fügen Sie einige Ausdrücke wie behandelt oder wenn User-Agent usw. – Stamos

+0

Das Problem ist, dass es keine Möglichkeit gibt, den User-Agent der Anfrage zu überprüfen. Zumindest habe ich noch keinen Weg gefunden. – GeorgeChond

2

Der einzige Weg, ich habe in der Lage gewesen, diese ziemlich zuverlässig zu bekommen zu arbeiten, sind das NavigationStarting Ereignis unter Verwendung der Seite zu laden und nutzen Sie die aktuelle URL zu löschen, dann ein benutzerdefiniertes Ereignis verwenden, um die neue Seite zu laden, triggern mit der richtigen 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; 
     } 
    } 
} 

Nicht schön, aber es scheint zu funktionieren.

0

Ich fand this trick by Matt Dot. Dadurch wird die User-Agent-Zeichenfolge dauerhaft geändert. Jede WebView Anfrage, ob manuell oder durch einen Link-Klick innerhalb des HTML, wird als User-Agent Header gesendet.

Hier ist die Quelle für den Fall, dass der Link stirbt.

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); 
     } 
    } 
} 

Sie können diesen Wert überall in Ihrer Anwendung ändern, aber wenn Sie es dauerhaft einstellen wollen, verwenden Sie den App.xaml.cs Konstruktor:

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

    // ... 
}