在UWP中设置自定义WebView标头

时间:2016-08-26 11:39:47

标签: c# xamarin webview win-universal-app uwp

这似乎与其他similar问题重复,但它们是旧线程,并非特定于Windows UWP应用。

我无法在WebView中设置自定义标头,因此WebView中加载的URL可能对我有用。

我见过许多论坛提供的解决方案就像使用HttpClient / WebRequest一样使用标题,但这并不像我的情况那样工作,用于重定向的Web地址使用Javascript和重定向之前需要很少的自定义标头才能正确加载。< / p>

同样WebView.NavigateWithHttpRequestMessage不太合适,因为它会回发,我需要每个请求的标头,包括web View中的javascript重定向网址。

我可以使用渲染器在Xamarin.Droid项目中设置自定义标题,但我无法找到任何UWP Windows.UI.Xaml.Controls.WebView的解决方案。

2 个答案:

答案 0 :(得分:6)

在通用Windows 10平台上,WebView.NavigateWithHttpRequestMessage方法是正确的方法。

  

一个。我需要每个请求的标头,包括网页视图中的javascript重定向网址。

     

湾这没有解决我的问题,因为在设置标题后多次调用OnWebViewNavigationStarting方法并且App会自动崩溃并出现System.StackOverflowException错误

这是因为如果我们在NavigationStarting事件中进行导航,就会发生无限导航。我们应该通过将WebViewNavigationStartingEventArgs.Cancel属性设置为 true ,在此事件的处理程序中取消导航

我们需要仔细添加/删除NavigationStarting事件的处理程序。

代码示例:

    private void NavigateWithHeader(Uri uri)
    {
        var requestMsg = new Windows.Web.Http.HttpRequestMessage(HttpMethod.Get, uri);
        requestMsg.Headers.Add("User-Name", "Franklin Chen");
        wb.NavigateWithHttpRequestMessage(requestMsg);

        wb.NavigationStarting += Wb_NavigationStarting;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        NavigateWithHeader(new Uri("http://openszone.com/RedirectPage.html"));
    }

    private void Wb_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
    {
        wb.NavigationStarting -= Wb_NavigationStarting;
        args.Cancel = true;//cancel navigation in a handler for this event by setting the WebViewNavigationStartingEventArgs.Cancel property to true
        NavigateWithHeader(args.Uri);
    }

屏幕截图是Fiddler中的日志信息,第二个红色矩形中的请求记录包含自定义标题:

enter image description here

我在here 中分享了我的UWP示例,您可以轻松地集成到您的Xamarin UWP应用中。

答案 1 :(得分:1)

使用Xamarin标签,看起来你正在使用Xamarin.Forms,因此下面的答案是关于Xamarin.Forms。 但是,代码也适用于UWP中的WebView。

您可以尝试为WebView创建自定义渲染器,然后尝试使用相同的WebView.NavigateWithHttpRequestMessage。

在导航之前,您可以尝试像这样设置标题:

var requestMsg = new Windows.Web.Http.HttpRequestMessage(HttpMethod.Get, new Uri("https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending"));
requestMsg.Headers.Add("User-Name", "AnubhavRanjan");
Control.NavigateWithHttpRequestMessage(requestMsg);

上面的Uri可以根据您的要求进行设置。

如果请求多次发生,您始终可以为NavigationStarting事件设置委托并在方法中处理它。

Control.NavigationStarting += OnWebViewNavigationStarting