Пример #1
0
        private void Webview_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
        {
            var requestUri = new Uri(e.Request.Uri);
            var host       = new Uri(requestUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped));

            if (host != customHost)
            {
                return;
            }

            try
            {
                var contentStream = Application.ContentProvider.GetStreamAsync(requestUri).GetAwaiter().GetResult();
                if (contentStream == null)
                {
                    e.Response = webView2Environment.CreateWebResourceResponse(null, 404, "Not Found", string.Empty);
                    return;
                }

                var mimeType = Application.ContentProvider.GetMimeType(requestUri);
                e.Response = webView2Environment.CreateWebResourceResponse(contentStream, 200, "OK", $"Content-Type: {mimeType}");
            }
            catch (Exception ex)
            {
                e.Response = webView2Environment.CreateWebResourceResponse(null, 500, ex.Message, string.Empty);
            }
        }
Пример #2
0
        private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
        {
            Uri    parsedUri = new Uri(e.Request.Uri);
            string path;

            if (parsedUri.Scheme == "file")
            {
                path = parsedUri.LocalPath;
            }
            else if (parsedUri.Scheme == "http" && parsedUri.Host == "make.urlparser.happy")
            {
                path = parsedUri.LocalPath.TrimStart('/', '\\');
            }
            else
            {
                return;
            }
            var extension = Path.GetExtension(path).ToLowerInvariant();
            var mimeMap   = new Dictionary <string, string>()
            {
                { ".html", "text/html;charset=utf-8" },
                { ".htm", "text/html;charset=utf-8" },
                { ".js", "text/javascript;charset=utf-8" },
                { ".css", "text/css;charset=utf-8" }
            };

            if (File.Exists(path))
            {
                e.Response = environment.CreateWebResourceResponse(
                    new MemoryStream(File.ReadAllBytes(path)),
                    200, "OK", "Content-Type: " +
                    (mimeMap.TryGetValue(extension, out string mimeType) ? mimeType : "application/octet-stream"));
            }
            else
            {
                string errorMessageTemplate = @"
<h2>Error: 404 Not Found</h2>
<p>Please inform developer with these information.</p>
<hr/>
<table>
    <tr><th>Missing Path</th><td>{0}</td></tr>
    <tr><th>URL String</th><td>{1}</td></tr>
    {2}
</table>
                ";
                var    urlParsed            = new Uri(e.Request.Uri);
                var    errorMessage         = string.Format(errorMessageTemplate, path, e.Request.Uri,
                                                            string.Join("\n", urlParsed.GetType().GetProperties()
                                                                        .Select(t => string.Format("<tr><th>{0}</th><td>{1}</td></tr>", t.Name, t.GetValue(urlParsed))))
                                                            );
                e.Response = environment.CreateWebResourceResponse(
                    new MemoryStream(Encoding.UTF8.GetBytes(errorMessage)),
                    404, "Not Found", "Content-Type: text/html;charset=utf-8"
                    );
            }
        }
Пример #3
0
        private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e)
        {
            Console.WriteLine(e.Request.Uri);
            if (e.Request.Uri == "https://www.gstatic.com/ytlr/txt/licenses_googletv.txt")
            {
                var stream = GenerateStreamFromString(Resource.Staff.Replace("\n", "\n\u200B"));
                e.Response = coreWebView2Environment.CreateWebResourceResponse(stream, 200, "OK", "Content-Type: text/html");
                new Thread(() =>
                {
                    Thread.Sleep(3000); // 流资源 3000ms 后释放
                    var action = new Action(() =>
                    {
                        stream.Close();
                    });

                    if (InvokeRequired)
                    {
                        Invoke(action);
                    }
                    else
                    {
                        action();
                    }
                }).Start();
            }
        }
        public void SetResponse(Stream content, int statusCode, string statusMessage, string headerString)
        {
            // NOTE: This is stream copying is to work around a hanging bug in WinRT with managed streams
            var memStream = new MemoryStream();

            content.CopyTo(memStream);
            var ms = new InMemoryRandomAccessStream();

            ms.WriteAsync(memStream.GetWindowsRuntimeBuffer()).AsTask().Wait();

            _webResourceRequestedEventArgs.Response = _environment.CreateWebResourceResponse(ms, statusCode, statusMessage, headerString);
        }
Пример #5
0
        private void HandleWebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs args)
        {
            var uriString = args.Request.Uri;
            var uri       = new Uri(uriString);

            if (SchemeHandlers.TryGetValue(uri.Scheme, out var handler) && _coreWebView2Environment != null)
            {
                var responseStream = handler(uriString, out var responseContentType);
                if (responseStream != null) // If null, the handler doesn't want to handle it
                {
                    responseStream.Position = 0;
                    args.Response           = _coreWebView2Environment.CreateWebResourceResponse(responseStream, StatusCode: 200, ReasonPhrase: "OK", Headers: $"Content-Type: {responseContentType}{Environment.NewLine}Cache-Control: no-cache, max-age=0, must-revalidate, no-store");
                }
            }
        }
Пример #6
0
        protected virtual Task HandleWebResourceRequest(CoreWebView2WebResourceRequestedEventArgs eventArgs)
        {
#if WEBVIEW2_WINFORMS || WEBVIEW2_WPF
            // Unlike server-side code, we get told exactly why the browser is making the request,
            // so we can be smarter about fallback. We can ensure that 'fetch' requests never result
            // in fallback, for example.
            var allowFallbackOnHostPage =
                eventArgs.ResourceContext == CoreWebView2WebResourceContext.Document ||
                eventArgs.ResourceContext == CoreWebView2WebResourceContext.Other;                 // e.g., dev tools requesting page source

            var requestUri = QueryStringHelper.RemovePossibleQueryString(eventArgs.Request.Uri);

            if (TryGetResponseContent(requestUri, allowFallbackOnHostPage, out var statusCode, out var statusMessage, out var content, out var headers))
            {
                var headerString = GetHeaderString(headers);

                eventArgs.Response = _coreWebView2Environment.CreateWebResourceResponse(content, statusCode, statusMessage, headerString);
            }
#elif WEBVIEW2_MAUI
            // No-op here because all the work is done in the derived WinUIWebViewManager
#endif
            return(Task.CompletedTask);
        }
 public void SetResponse(IRandomAccessStream content, int statusCode, string statusMessage, string headerString)
 {
     _webResourceRequestedEventArgs.Response = _environment.CreateWebResourceResponse(content, statusCode, statusMessage, headerString);
 }