5

वर्तमान में, मैं इस प्रकार एक अनुरोध संदेश के उपयोगकर्ता-एजेंट की स्थापना कर रहा हूँ पर परिभाषित उपयोगकर्ता-एजेंट:WebView - हर अनुरोध

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

सब कुछ उम्मीद के रूप में काम करता है।

लेकिन, जब मैं साइट पर किसी लिंक पर क्लिक करके किसी अन्य पृष्ठ पर जा रहा हूं, तो उपयोगकर्ता-एजेंट WebView के डिफ़ॉल्ट पर रीसेट हो जाता है।

वहाँ स्थायी रूप से उपयोगकर्ता-एजेंट स्थापित करने या पर इसे बदलने हर अनुरोध किया की कोई तरीका है? पहले वेबव्यू नई सामग्री पर जाता

धन्यवाद, जॉर्ज

+0

[मुझे नहीं लगता कि आप कर सकते हैं] (https: // social.msdn.microsoft.com/Forums/en-US/ea00647f-ba00-45a0-8df0-fa267f073ab9/set-webview-user-agent-string?forum=winappswithcsharp)। – DavidG

+0

@DavidG आपकी टिप्पणी के लिए धन्यवाद, लेकिन यह विंडोज 8 के लिए है। मैं एमएसडीएन पर उल्लेख किए गए मईब्रीथ के रूप में पहले अनुरोध पर उपयोगकर्ता-एजेंट को बदल सकता हूं, लेकिन जब मैं किसी दूसरे पृष्ठ पर जा रहा हूं तो यह डिफ़ॉल्ट रूप से बदलता रहता है। – GeorgeChond

+0

हां, मुझे पता है कि यह विंडोज 8 है, वह लिंक अभी भी मान्य है। – DavidG

उत्तर

1

NavigationStarting होता है। आप उस ऑपरेशन को args.Uri प्राप्त कर सकते हैं और HttpRequestMessage पर नेविगेट कर सकते हैं। 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

आपके उत्तर Stamatis के लिए धन्यवाद! लेकिन, वह 'StackOverflowException' फेंक देगा क्योंकि यह हमेशा नेविगेशन शुरू करेगा और इसे रद्द कर देगा। – GeorgeChond

+0

फिर कुछ अभिव्यक्तियों को संभालने की तरह जोड़ें या यदि उपयोगकर्ता-एजेंट आदि – Stamos

+0

समस्या यह है कि अनुरोध के उपयोगकर्ता-एजेंट को जांचने का कोई तरीका नहीं है। कम से कम, मुझे अभी तक कोई रास्ता नहीं मिला है। – GeorgeChond

2

एक ही रास्ता है कि मैं इस काफी मज़बूती से काम करने के लिए पृष्ठ लोड रद्द करने और वर्तमान यूआरएल पाने के लिए NavigationStarting घटना का उपयोग करना है प्राप्त करने में सक्षम किया गया है, तो नए पृष्ठ लोड को गति प्रदान करने के लिए एक कस्टम ईवेंट का उपयोग सही 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; 
     } 
    } 
} 

सुंदर नहीं है, लेकिन ऐसा लगता है।

0

मुझे this trick by Matt Dot मिला। यह उपयोगकर्ता-एजेंट स्ट्रिंग को स्थायी रूप से बदल देगा। कोई भी WebView अनुरोध, मैन्युअल या HTML के अंदर एक लिंक-क्लिक के माध्यम से, आपका मान उपयोगकर्ता-एजेंट शीर्षलेख के रूप में भेजा जाएगा।

लिंक मरने के मामले में स्रोत यहां दिया गया है।

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

आपको अपने एप्लिकेशन में कहीं भी यह राशि बदल सकते हैं, लेकिन अगर आप चाहते हैं यह स्थायी रूप से निर्धारित करते हैं, App.xaml.cs निर्माता का उपयोग करें:

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

    // ... 
}