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); } }
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e) { var myUri = new Uri("https://music.youtube.com/"); if (myUri.IsBaseOf(e.Request.RequestUri)) { string json = JsonConvert.SerializeObject(e.Request.Headers); dynamic obj = JsonConvert.DeserializeObject(json); try { string cookieValue = obj[1].Value[0].ToString(); if (cookieValue.Contains("VISITOR_INFO1_LIVE") && cookieValue.Contains("SID") && cookieValue.Contains("__Secure") && cookieValue.Contains("LOGIN_INFO")) { MainForm.Settings.AuthenticationCookie = cookieValue; Task.Run(async() => await MainForm.Settings.Save()); lblSignInMessage.Visible = false; pbConnectSuccess.Visible = true; lblConnectSuccess.Visible = true; } } catch { } } }
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(); } }
/// <summary> /// Embedded Resources 请求事件 /// </summary> /// <param name="e">CoreWebView2WebResourceRequestedEventArgs</param> public static void LocalResourcesRequested(CoreWebView2WebResourceRequestedEventArgs e) { var domain = string.Empty; var dir = string.Empty; string assemblyPath = null; foreach (var resourcesHandler in AppRuntime.RunTime.LocalResourcesHandlers.Where(resourcesHandler => Regex.IsMatch(e.Request.Uri, @"^" + resourcesHandler.uri + "/{0,}.*", RegexOptions.IgnoreCase))) { domain = resourcesHandler.uri; dir = resourcesHandler.dir; assemblyPath = Path.GetDirectoryName(resourcesHandler.resource.Location); break; } // 判断是否满足嵌入资源拦截 if (!string.IsNullOrWhiteSpace(domain) && !string.IsNullOrWhiteSpace(assemblyPath)) { // 提取域名之后的取资源路径 var resourcePath = Regex.Replace(e.Request.Uri, @"^" + domain + "/{0,}", string.Empty); // 剔除路径的参数, 提取资源路径 resourcePath = Regex.Replace(resourcePath, @"\?.*", string.Empty).ToLower(); var memiType = new Uri(e.Request.Uri).MimeType(); var fileInfo = new FileInfo($"{assemblyPath}.{dir}.{resourcePath}"); if (fileInfo.Exists) { var stream = fileInfo.OpenRead(); if (stream != null) { e.Response = Resource(stream, memiType); } } } }
public async void ShouldInterceptRequest(CoreWebView2 view, CoreWebView2WebResourceRequestedEventArgs args) { //var uri = args.Request.RequestUri; var uri = new Uri(args.Request.Uri); int index; // walk up our multipart/related stack looking for the MIME part for the requested URL for (int i = stack.Count - 1; i >= 0; i--) { var related = stack[i]; if ((index = related.IndexOf(uri)) == -1) { continue; } if (related[index] is MimePart part) { var mimeType = part.ContentType.MimeType; var charset = part.ContentType.Charset; var stream = part.Content.Open(); // construct our response containing the decoded content // https://stackoverflow.com/questions/7669311/is-there-a-way-to-convert-a-system-io-stream-to-a-windows-storage-streams-irando var memStream = new MemoryStream(); await stream.CopyToAsync(memStream); memStream.Position = 0; args.Response = view.Environment.CreateWebResourceResponse(memStream.AsRandomAccessStream(), 200, "OK", $"Content-Type: {mimeType}; charset={charset}"); } } }
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); }
private void BrowserWebResourceRequestedAsync(object sender, CoreWebView2WebResourceRequestedEventArgs e) { var coreWebView2 = (CoreWebView2)sender; Action <ResourceResponse, CoreWebView2Deferral> callback = (ResourceResponse resourceResponse, CoreWebView2Deferral deferral) => { try { var response = coreWebView2.Environment .CreateWebResourceResponse(resourceResponse.Stream, resourceResponse.StatusCode, resourceResponse.ReasonPhrase, resourceResponse.GetHeaderString()); if (response != null) { e.Response = response; } } catch (Exception exception) { Console.WriteLine(exception.Message); Console.WriteLine(exception.StackTrace); } finally { deferral?.Complete(); deferral = null; } }; var request = new ResourceRequest(e.Request.Uri, e.Request.Method, e.Request.Headers, e.Request.Content); _owinResourceHandler.ProcessRequest(request, e.GetDeferral(), callback); }
protected override async Task HandleWebResourceRequest(CoreWebView2WebResourceRequestedEventArgs eventArgs) { // 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 // Get a deferral object so that WebView2 knows there's some async stuff going on. We call Complete() at the end of this method. using var deferral = eventArgs.GetDeferral(); var requestUri = QueryStringHelper.RemovePossibleQueryString(eventArgs.Request.Uri); // First, call into WebViewManager to see if it has a framework file for this request. It will // fall back to an IFileProvider, but on WinUI it's always a NullFileProvider, so that will never // return a file. if (TryGetResponseContent(requestUri, allowFallbackOnHostPage, out var statusCode, out var statusMessage, out var content, out var headers) && statusCode != 404) { // NOTE: This is stream copying is to work around a hanging bug in WinRT with managed streams. // See issue https://github.com/microsoft/CsWinRT/issues/670 var memStream = new MemoryStream(); content.CopyTo(memStream); var ms = new InMemoryRandomAccessStream(); await ms.WriteAsync(memStream.GetWindowsRuntimeBuffer()); var headerString = GetHeaderString(headers); eventArgs.Response = _coreWebView2Environment !.CreateWebResourceResponse(ms, statusCode, statusMessage, headerString); }
/// <summary> /// Embedded Resources 请求事件 /// </summary> /// <param name="e">CoreWebView2WebResourceRequestedEventArgs</param> public static void EmbeddedResourcesRequested(CoreWebView2WebResourceRequestedEventArgs e) { var domain = string.Empty; var dir = string.Empty; Assembly resource = null; foreach (var resourcesHandler in AppRuntime.RunTime.EmbeddedResourcesHandlers.Where(resourcesHandler => Regex.IsMatch(e.Request.Uri, @"^" + resourcesHandler.uri + "/{0,}.*", RegexOptions.IgnoreCase))) { domain = resourcesHandler.uri; dir = resourcesHandler.dir; resource = resourcesHandler.resource; break; } // 判断是否满足嵌入资源拦截 if (!string.IsNullOrWhiteSpace(domain) && resource != null) { // 提取域名之后的取资源路径 var resourcePath = Regex.Replace(e.Request.Uri, @"^" + domain + "/{0,}", string.Empty); // 剔除路径的参数, 提取资源路径 resourcePath = Regex.Replace(resourcePath, @"\?.*", string.Empty).ToLower(); resourcePath = resourcePath.Replace("/", "."); var memiType = new Uri(e.Request.Uri).MimeType(); var stream = resource.GetManifestResourceStream($"{resource.GetName().Name}.{dir}.{resourcePath}"); //当作为一个资源被嵌入后,资源的完整名称会由项目的默认命名空间与文件名组成 if (stream != null) { e.Response = Resource(stream, memiType); } } }
public WinUICoreWebView2WebResourceRequestedEventArgsWrapper(CoreWebView2Environment environment, CoreWebView2WebResourceRequestedEventArgs webResourceRequestedEventArgs) { _environment = environment; _webResourceRequestedEventArgs = webResourceRequestedEventArgs; Request = new WinUICoreWebView2WebResourceRequestWrapper(webResourceRequestedEventArgs); ResourceContext = (CoreWebView2WebResourceContextWrapper)webResourceRequestedEventArgs.ResourceContext; }
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e) { if (uiHandler.IsValidUrl(e.Request.Uri)) { var item = mainWebView.CoreWebView2.Environment.CreateWebResourceResponse(uiHandler.Resolve(e.Request.Uri), 200, null, null); e.Response = item; } }
private void OnNavigate(object?sender, CoreWebView2WebResourceRequestedEventArgs e) { var canAccess = this.filter?.Invoke(e.Request.Uri) ?? true; if (!canAccess) { e.Response = this.wv2 !.Environment.CreateWebResourceResponse(new MemoryStream(), 0, "Permission Requred", null); } }
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" ); } }
/// <summary> /// 注册 CoreWebView2OnWebResourceRequested 事件 /// </summary> /// <param name="sender">sender</param> /// <param name="e">CoreWebView2WebResourceRequestedEventArgs</param> private static void CoreWebView2OnWebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e) { if (RequestHandlers == null || !RequestHandlers.Any()) { return; } foreach (var handler in RequestHandlers) { handler.Value?.Invoke(e); } }
private void _vistaHtml_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e) { if (this._tiempos != null) { this._tiempos.Add(new EntryOfTime { Etiqueta = "SOLICITUD DE RECURSO", Mensaje = "Se solicita el recurso " + e.Request.Uri, Tiempo = DateTime.Now }); this.DibujaDiagrama(); } }
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; var environment = (CoreWebView2Environment)Control.GetType().GetProperty("Environment", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(Control); field = environment.GetType().GetField("_nativeCoreWebView2Environment", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); var nativeEnvironment = field.GetValue(environment); 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); } } }
private async void BrowserWebResourceRequestedAsync(object sender, CoreWebView2WebResourceRequestedEventArgs e) { var deferral = e.GetDeferral(); var request = new ResourceRequest(e.Request.Uri, e.Request.Method, e.Request.Headers, e.Request.Content); var response = await RequestInterceptor.ProcessRequest(_appFunc, request); var coreWebView2 = (CoreWebView2)sender; e.Response = coreWebView2.Environment.CreateWebResourceResponse(response.Stream, response.StatusCode, response.ReasonPhrase, response.GetHeaderString()); deferral.Complete(); }
private void HandleWebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs args) { var uriString = args.Request.Uri; 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; args.Response = Control.CoreWebView2.Environment.CreateWebResourceResponse(responseStream, StatusCode: 200, ReasonPhrase: "OK", Headers: $"Content-Type: {responseContentType}"); } } }
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"); } } }
private async void Webview_WebResourceRequested(object?sender, CoreWebView2WebResourceRequestedEventArgs e) { using var deferral = e.GetDeferral(); var uri = new Uri(e.Request.Uri); var contentStream = await Application.ContentProvider.GetStreamAsync(uri); if (contentStream == null) { e.Response = webview.CoreWebView2.Environment.CreateWebResourceResponse(null, 404, "Not Found", string.Empty); } else { e.Response = webview.CoreWebView2.Environment.CreateWebResourceResponse(contentStream, 200, "OK", string.Empty); e.Response.Headers.AppendHeader("Content-Type", MimeTypes.FindForUri(uri)); } }
/// <summary> /// API 请求事件 /// </summary> /// <param name="e">CoreWebView2WebResourceRequestedEventArgs</param> public static void WebApiRequested(CoreWebView2WebResourceRequestedEventArgs e) { // 判断是否为API 域名请求 if (Regex.IsMatch(e.Request.Uri, @"^" + AppRuntime.RunTime.ApiDomain + "/{0,}.*", RegexOptions.IgnoreCase)) { // 提取域名之后的函数名称路径 var methodPath = Regex.Replace(e.Request.Uri, @"^" + AppRuntime.RunTime.ApiDomain + "/{0,}", string.Empty); // 剔除路径的参数, 提取函数名称 methodPath = Regex.Replace(methodPath, @"\?.*", string.Empty).ToLower(); // 查找 API 路由 var route = AppRuntime.RunTime.Routes.FirstOrDefault(m => m.RoutePath == methodPath && m.RouteMethod.Method.ToUpper() == e.Request.Method.ToUpper()); // 执行API e.Response = route?.ExecuteCore(e.Request); } }
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 WinUICoreWebView2WebResourceRequestWrapper(CoreWebView2WebResourceRequestedEventArgs webResourceRequestedEventArgs) { _webResourceRequestedEventArgs = webResourceRequestedEventArgs; }
private void CoreWebView2_WebResourceRequested(object sender, CoreWebView2WebResourceRequestedEventArgs e) { Debug.WriteLine($"WebResourceRequested: {e.Request.Uri}"); }