コード例 #1
0
        private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
        {
            var responseStream      = File.OpenRead(@"c:\\test.png");
            var responseContentType = "image/png";

            var eventType  = e.GetType();
            var field      = eventType.GetField("_nativeCoreWebView2WebResourceRequestedEventArgs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            var nativeArgs = field.GetValue(e);

            field = _webView2Environment.GetType().GetField("_nativeCoreWebView2Environment", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            var nativeEnvironment = field.GetValue(_webView2Environment);

            var managedStream = Activator.CreateInstance(eventType.Assembly.GetType("Microsoft.Web.WebView2.Core.ManagedIStream"),
                                                         System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance,
                                                         null,
                                                         new object[] { responseStream },
                                                         null);

            var createWebSourceResponseMethod = eventType.Assembly.GetType("Microsoft.Web.WebView2.Core.Raw.ICoreWebView2Environment").GetMethod("CreateWebResourceResponse", new Type[] { Type.GetType("System.Runtime.InteropServices.ComTypes.IStream"), typeof(int), typeof(string), typeof(string) });
            var response = createWebSourceResponseMethod.Invoke(nativeEnvironment, new object[] { managedStream, 200, "OK", $"Content-Type: {responseContentType}" });

            var responseProperty = eventType.Assembly.GetType("Microsoft.Web.WebView2.Core.Raw.ICoreWebView2WebResourceRequestedEventArgs").GetProperty("Response");

            responseProperty.SetValue(nativeArgs, response);
        }
コード例 #2
0
        private void HandleWebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs args)
        {
            // TODO: we have to resort to reflection here because of two issues:
            //
            // 1) The Uri for the framework resource has a custom scheme and HttpRequestMessage does not respond
            //    non http schemes:
            //    https://github.com/dotnet/runtime/blob/0c7e9c19cb22420248c53eec6bb885fb563c700d/src/libraries/System.Net.Http/src/System/Net/Http/HttpRequestMessage.cs#L89-L92
            //    https://github.com/dotnet/runtime/blob/0c7e9c19cb22420248c53eec6bb885fb563c700d/src/libraries/System.Net.Http/src/System/Net/Http/HttpRequestMessage.cs#L188-L191
            //    So we have to take the Uri string from the native ICoreWebView2WebResourceRequest and create an
            //    Uri from it ourselves.
            //    This issue is tracked here: https://github.com/MicrosoftEdge/WebViewFeedback/issues/325
            // 2) There is a null reference exception that occurs in WebView2 when trying to set the response on the event
            //    argument.
            //    This issue is tracked here: https://github.com/MicrosoftEdge/WebViewFeedback/issues/219

            var eventType  = args.GetType();
            var field      = eventType.GetField("_nativeCoreWebView2WebResourceRequestedEventArgs", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            var nativeArgs = field.GetValue(args);

            var requestProperty = eventType.Assembly.GetType("Microsoft.Web.WebView2.Core.Raw.ICoreWebView2WebResourceRequestedEventArgs").GetProperty("Request");
            var nativeRequest   = requestProperty.GetValue(nativeArgs);
            var uriProperty     = eventType.Assembly.GetType("Microsoft.Web.WebView2.Core.Raw.ICoreWebView2WebResourceRequest").GetProperty("Uri");
            var uriString       = (string)uriProperty.GetValue(nativeRequest);
            var uri             = new Uri(uriString);

            if (Element.SchemeHandlers.TryGetValue(uri.Scheme, out var handler))
            {
                var responseStream = handler(uriString, out var responseContentType);
                if (responseStream != null) // If null, the handler doesn't want to handle it
                {
                    responseStream.Position = 0;

                    field = _coreWebView2Environment.GetType().GetField("_nativeCoreWebView2Environment", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                    var nativeEnvironment = field.GetValue(_coreWebView2Environment);

                    var managedStream = Activator.CreateInstance(eventType.Assembly.GetType("Microsoft.Web.WebView2.Core.ManagedIStream"),
                                                                 System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance,
                                                                 null,
                                                                 new object[] { responseStream },
                                                                 null);

                    var createWebSourceResponseMethod = eventType.Assembly.GetType("Microsoft.Web.WebView2.Core.Raw.ICoreWebView2Environment").GetMethod("CreateWebResourceResponse", new Type[] { Type.GetType("System.Runtime.InteropServices.ComTypes.IStream"), typeof(int), typeof(string), typeof(string) });
                    var response = createWebSourceResponseMethod.Invoke(nativeEnvironment, new object[] { managedStream, 200, "OK", $"Content-Type: {responseContentType}" });

                    var responseProperty = eventType.Assembly.GetType("Microsoft.Web.WebView2.Core.Raw.ICoreWebView2WebResourceRequestedEventArgs").GetProperty("Response");
                    responseProperty.SetValue(nativeArgs, response);
                }
            }
        }