2015-07-11 24 views
0

有没有办法提取WebView控件使用的用户代理字符串?如果是这样,如果有人能给我一种方法,我将不胜感激。使用以下似乎不工作:C#Windows应用商店WebView获取用户代理

 var userAgent = new StringBuilder(256); 
     int length = 0; 
     UrlMkGetSessionOption(UrlMonOptionUserAgent, userAgent, userAgent.Capacity - 1, ref length, 0); 

回答

1

我收回那句话,用UrlMkGetSessionOption在代码中提到的上述不工作。

+0

我的评论变得太大了,所以增加了一个可以扩展你的答案。有一个upvote。 – Stajs

1

我目前使用这种方法,改编自最初为windows phone提供的方法。它给出了正确的结果,并从WebView对象的实例中直接得到它,因此让我更有信心具有正确的价值。

private static string s_userAgent = null; 

    // Get the default UserAgent which webviews use on this platform. 
    public async Task<string> GetUserAgent() 
    { 
     if (s_userAgent == null) 
     { 
      const string Html = @"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN""> 
           <html> 
           <head> 
            <script language=""javascript"" type=""text/javascript""> 
             function notifyUA() { window.external.notify(navigator.userAgent); } 
            </script> 
           </head> 
           <body onload=""notifyUA();""></body> 
           </html>"; 

      SemaphoreSlim signal_done = new SemaphoreSlim(0, 1); 

      var wv = new WebView(); 
      wv.ScriptNotify += (sender, args) => 
      { 
       s_userAgent = args.Value; 
       // set signal, to show we've done 
       signal_done.Release(); 
      }; 
      wv.NavigateToString(Html); 

      // wait for signal 
      await signal_done.WaitAsync(); 

      Debug.WriteLine("GetUserAgent() called. User agent from WebView: \n{0}", s_userAgent); 
     } 

     return s_userAgent; 
    } 
0

这开始作为评论,但变得太长了。为了扩大他(@Rexfelis)自己的答案:

我发现可以有什么取决于你在应用程序生命周期,其中UrlMkGetSessionOption回报差异,如果WebView已经在XAML视图尚未初始化。

如果在组件初始化之前调用它,它将会丢失WebView/3.0(至少在Windows 10中);初始化之后,它将具有与@SimonTillson的答案相同的文本和结果。

如果您需要在组件初始化之前了解正确的用户代理,则必须新建WebView并在查询UrlMkGetSessionOption之前导航;例如var wv = new WebView(); wv.NavigateToString(...);。看起来用户代理在第一次导航时被修改以包括WebView/3.0

相关问题