代码之家  ›  专栏  ›  技术社区  ›  Paul

未通过webview上设置的请求头

  •  0
  • Paul  · 技术社区  · 7 年前

    我已经实现了一个自定义的web视图渲染器,自定义的WebViewClient如下所示。然而,新的标题并没有到达页面的最远位置。我错过了什么?

    “otherheader”可以通过(但仅在第一次请求时),但“mysource”不能。

    webview客户端

    public class MyWebViewClient : WebViewClient
    {
        public override WebResourceResponse ShouldInterceptRequest(WebView view, IWebResourceRequest urlResource)
        {
            if (!urlResource.RequestHeaders.ContainsKey("mysource"))
            {
                urlResource.RequestHeaders.Add("mysource", "app");
            }
    
            return base.ShouldInterceptRequest(view, urlResource);
        }
    }
    

    自定义呈现程序

    [assembly: ExportRenderer(typeof(HybridWebView), typeof(HybridWebViewRenderer))]
    namespace CustomRenderer.Droid
    {
        public class HybridWebViewRenderer : ViewRenderer<HybridWebView, Android.Webkit.WebView>
        {
            Context _context;
    
            public HybridWebViewRenderer(Context context) : base(context)
            {
                _context = context;
            }
    
            protected override void OnElementChanged(ElementChangedEventArgs<HybridWebView> e)
            {
                base.OnElementChanged(e);
    
                if (Control == null)
                {
                    var webView = new Android.Webkit.WebView(_context);
                    webView.Settings.JavaScriptEnabled = true;
                    webView.SetWebViewClient(new MyWebViewClient());
                    SetNativeControl(webView);
                }
                if (e.OldElement != null)
                {
                    var hybridWebView = e.OldElement as HybridWebView;
                    hybridWebView.Cleanup();
                }
                if (e.NewElement != null)
                {
                    IDictionary<string, string> headers = new Dictionary<string, string>();
                    headers.Add("otherheader", "yes");
                    Control.LoadUrl(e.NewElement.Uri, headers);
                }
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Billy Liu - MSFT    7 年前

    你应该还一个新的 WebResourceResponse 而不是 return base.ShouldInterceptRequest(view, urlResource); .

    例如:

    public override WebResourceResponse ShouldInterceptRequest(WebView view, IWebResourceRequest urlResource)
    {
        if (!urlResource.RequestHeaders.ContainsKey("mysource"))
        {
            urlResource.RequestHeaders.Add("mysource", "app");
        }
        var client = new HttpClient();
    
        var result = client.GetAsync(urlResource.Url,ToString()).Result;
        string contentType = result.Content.Headers.ContentType.ToString();
        var stream = result.Content.ReadStreamAsync().Result;
    
        return new WebResourceResponse("text/html", "charset=utf-8", (int)result.StatusCode, result.ReasonPhrase, urlResource.RequestHeaders, stream);
    }