C#Windows应用商店WebView获取用户代理

C#Windows应用商店WebView获取用户代理,c#,windows-store-apps,windows-store,C#,Windows Store Apps,Windows Store,是否有方法提取WebView控件使用的用户代理字符串?如果是这样,如果有人能给我一个这样做的方法,我将不胜感激。使用以下方法似乎不起作用: var userAgent = new StringBuilder(256); int length = 0; UrlMkGetSessionOption(UrlMonOptionUserAgent, userAgent, userAgent.Capacity - 1, ref length, 0); 我收回

是否有方法提取WebView控件使用的用户代理字符串?如果是这样,如果有人能给我一个这样做的方法,我将不胜感激。使用以下方法似乎不起作用:

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

我收回这一点,使用上面代码中提到的UrlMkGetSessionOption确实有效。

我目前使用的是这个方法,它是从最初为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;
    }
私有静态字符串s_userAgent=null;
//获取WebView在此平台上使用的默认UserAgent。
公共异步任务GetUserAgent()
{
如果(s_userAgent==null)
{
常量字符串Html=@”
函数notifyUA(){window.external.notify(navigator.userAgent);}
";
信号量lim signal_done=新信号量lim(0,1);
var wv=new WebView();
wv.ScriptNotify+=(发送方,参数)=>
{
s_userAgent=args.Value;
//设置信号,以显示我们已经完成
信号_完成。释放();
};
wv.NavigateToString(Html);
//等待信号
等待信号_done.WaitAsync();
Debug.WriteLine(“GetUserAgent()从WebView:\n{0}调用了.User代理”,s_userAgent);
}
返回s_userAgent;
}

这开始只是一条注释,但太长了。要扩展他(@Rexfelis)自己的答案:

我发现
UrlMkGetSessionOption
返回的内容可能有所不同,这取决于您在应用程序生命周期中的位置,以及
WebView
是否已在XAML视图中初始化

如果在组件初始化之前调用它,它将丢失
WebView/3.0
(至少在Windows 10中);初始化后,它将具有该文本,并生成与@SimonTillson的答案相同的字符串


如果您需要在组件初始化之前了解正确的用户代理,则必须在查询
UrlMkGetSessionOption
之前新建
WebView
并进行导航;e、 g.
var wv=new WebView();导航字符串(…)。似乎用户代理在第一次导航时被修改为包含
WebView/3.0

我的评论太大了,因此添加了一个答案,扩展了您的答案。投票表决。