예제 #1
0
        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);
            }