protected virtual async Task HandleWebResourceRequest(ICoreWebView2WebResourceRequestedEventArgsWrapper 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 == CoreWebView2WebResourceContextWrapper.Document || eventArgs.ResourceContext == CoreWebView2WebResourceContextWrapper.Other; // e.g., dev tools requesting page source 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)) { // 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(); await ms.WriteAsync(memStream.GetWindowsRuntimeBuffer()); var headerString = GetHeaderString(headers); eventArgs.SetResponse(ms, statusCode, statusMessage, headerString); } }
protected override async Task HandleWebResourceRequest(ICoreWebView2WebResourceRequestedEventArgsWrapper 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 == CoreWebView2WebResourceContextWrapper.Document || eventArgs.ResourceContext == CoreWebView2WebResourceContextWrapper.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(); // 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(eventArgs.Request.Uri, 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.SetResponse(ms, statusCode, statusMessage, headerString); }