5

Şu anda, bir istek mesajının User-Agent kuruyorum her istekte User-Agent tanımlayın: beklendiği gibiWebView - aşağıdaki gibi

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

Her şey çalışır.

Ama örneğin sitede bir bağlantıyı tıklayarak, bir başka bir sayfaya ediyorum, User-Agent WebView varsayılan sıfırlar.

her istek yapıldığında kalıcı User-Agent ayarlama veya üzerine değişen bir yolu var mı? webview yeni içerik gider önce

sayesinde George

+0

[sanmıyorum yapabilirsiniz] (https: // social.msdn.microsoft.com/Forums/en-US/ea00647f-ba00-45a0-8df0-fa267f073ab9/set-webview-user-agent-string?forum=winappswithcsharp). – DavidG

+0

@DavidG Yorumunuz için teşekkürler, ancak bu Windows 8 içindir. İlk isteği üzerine Kullanıcı Aracısı'nı, MSDN'de bahsedilen MAYBreath olarak değiştirebilirim, ancak farklı bir sayfaya giderken varsayılan olarak değişmeye devam ediyor. – GeorgeChond

+0

Evet, Windows 8 olduğunu biliyorum, bu bağlantı hala geçerli. – DavidG

cevap

1

NavigationStarting oluşur. Bu işlemi iptal edip args.Uri'u alabilir ve HttpRequestMessage ile gezinebilirsiniz. Ayrıca FrameNavigationStarting da var.

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

Cevabınız için teşekkürler Stamatis! Ancak, bu, her zaman navigasyonu başlatıp iptal edeceği için StackOverflowException öğesini atar. – GeorgeChond

+0

Ardından, bazı ifadeleri ele aldığınız şekilde veya Kullanıcı aracısı vb. Ekleyin. – Stamos

+0

Sorun, kullanıcının Kullanıcı Aracısı'nı denetlemenin bir yolu olmamasıdır. En azından henüz bir yol bulamadım. – GeorgeChond

2

bu oldukça güvenilir bir işe geçerli url sayfasının yüklenmesini iptal edip almak için NavigationStarting Olay kullanmaktır almak mümkün oldum tek yolu, daha sonra yeni bir sayfa yükünü tetiklemek için özel bir etkinlik kullanın doğru UA ile.

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

Güzel değil ama işe yarıyor.

0

this trick by Matt Dot numaralı telefonu buldum. Bu, kullanıcı aracı dizesini kalıcı olarak değiştirecektir. İster manuel isterse HTML'nin içinde bir bağlantı tıklaması olsun, WebView numaralı herhangi bir istek, değerinizi Kullanıcı-Aracı başlığı olarak gönderecektir.

Bağlantının kalması durumunda kaynak İşte.

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

Sen uygulamanın herhangi bir yerinde bu değeri değiştirmek, ancak kalıcı set istiyorsanız, App.xaml.cs yapıcısını kullanabilirsiniz:

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

    // ... 
}