c#使用webView2 访问本地静态html资源跨域Cors问题 (附带代理服务helper帮助类)

这篇具有很好参考价值的文章主要介绍了c#使用webView2 访问本地静态html资源跨域Cors问题 (附带代理服务helper帮助类)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

在浏览器中访问本地静态资源html网页时,可能会遇到跨域问题如图。

c#使用webView2 访问本地静态html资源跨域Cors问题 (附带代理服务helper帮助类)

 

是因为浏览器默认启用了同源策略,即只允许加载与当前网页具有相同源(协议、域名和端口)的内容。

WebView2默认情况下启用了浏览器的同源策略,即只允许加载与主机相同源的内容。所以如果我们把静态资源发布到iis或者通过node进行启动就可以看到不跨域了。

解决方案

  1. 使用CORS(Cross-Origin Resource Sharing):如果你有控制服务器端,可以在服务器端配置CORS来允许跨域请求。在服务器端的响应头中添加相关的CORS头部信息,例如允许访问的域名、请求方法等,以允许JavaScript跨域访问。

  2. 使用WebView2的 AddWebResourceRequestedFilter 方法:通过添加Web资源请求过滤器,你可以拦截WebView2控件中加载的资源请求,并进行处理。在拦截到JavaScript文件请求时,修改响应头部信息,添加Access-Control-Allow-Origin头部来解决跨域问题。
  3. 使用代理服务器:你可以在本地启动一个代理服务器,将WebView2控件的请求转发到代理服务器上,然后代理服务器再将请求发送到原始服务器并返回响应。在代理服务器上你可以设置合适的CORS头部信息来解决跨域问题。

思路

  1. 首先,确保你已经安装了Microsoft.Web.WebView2。你可以在Visual Studio的NuGet包管理器中搜索并安装此包。

  2. 然后通过HttpListener进行文件夹的静态资源进行代理发布
  3. 然后通过webview2进行导航访问即可我们会发现跨域问题已经解决

    c#使用webView2 访问本地静态html资源跨域Cors问题 (附带代理服务helper帮助类)

     

代码

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinApp.View
{
    public partial class Cors : Form
    {
        // 创建HttpListener对象并指定绑定的端口
        HttpListener _listener;
        string _folderPath;
        string _rootDirectory;

        public Cors()
        {
            InitializeComponent();

            // 初始化
            InitializeAsync();
        }

        private async void InitializeAsync()
        {
            // 获取本地静态资源的路径             
            _rootDirectory = AppDomain.CurrentDomain.BaseDirectory + "offline-exam-player"; //设置本地离线播放器为代理服务
            _rootDirectory = @"C:\Users\admin\Documents\WeChat Files\wxid_1ofgk575ybpt22\FileStorage\File\2024-02\ng-alain8\ng-alain8/";
            _folderPath = @"C:\Users\admin\Documents\WeChat Files\wxid_1ofgk575ybpt22\FileStorage\File\2024-02\ng-alain8\ng-alain8/index.html";

            _listener = new HttpListener();
            // 设置代理服务器的监听地址和端口号
            _listener.Prefixes.Add("http://localhost:8080/");
            _listener.Start();

            // 启动代理服务器
            Task.Run(() =>
            {
                // 启动代理服务器
                ProcessRequests();
            });

            // 停止代理服务器(这里演示就不停止了)
            //server.Stop();
        }

        private void ProcessRequests()
        {
            try
            {
                while (_listener.IsListening)
                {
                    HttpListenerContext context = _listener.GetContext();
                    string requestPath = context.Request.Url.AbsolutePath;
                    string filePath = _rootDirectory + requestPath;

                    // Serve the requested file if it exists
                    if (System.IO.File.Exists(filePath))
                    {
                        string extension = System.IO.Path.GetExtension(filePath);
                        string contentType;
                        switch (extension)
                        {
                            case ".html":
                                contentType = "text/html";
                                break;
                            case ".js":
                                contentType = "application/javascript";
                                break;
                            case ".less":
                            case ".css":
                                contentType = "text/css";
                                break;
                            case ".svg":
                                contentType = "image/svg+xml";
                                break;
                            default:
                                contentType = "application/octet-stream";
                                break;
                        }

                        context.Response.ContentType = contentType;
                        //context.Response.ContentType = "text/html";
                        byte[] responseBuffer = System.IO.File.ReadAllBytes(filePath);
                        context.Response.OutputStream.Write(responseBuffer, 0, responseBuffer.Length);
                        context.Response.Close();
                    }
                    else
                    {
                        // Return a 404 response if the file does not exist
                        context.Response.StatusCode = 404;
                        context.Response.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                // Handle any exceptions that may occur
                Console.WriteLine(ex.ToString());
            }
        }


        private async void Cors_Load(object sender, EventArgs e)
        {
            //本地静态资源,直接访问会出现跨院,如果通过iis访问则不会跨域;

            // 确保CoreWebView2运行时已准备就绪
            await webView21.EnsureCoreWebView2Async();

            // 在WebView2控件中加载URL
            //webView21.CoreWebView2.Navigate(_folderPath);            
            webView21.CoreWebView2.Navigate("http://localhost:8080/" + "index.html");
        }

    }
}

 

代理服务帮助类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace WinApp.Until
{
    public class ProxyHelper
    {
        private readonly HttpListener _listener;
        private readonly string _rootDirectory;

        /// <summary>
        /// 实例化
        /// </summary>
        /// <param name="serviceIp">代理的ip地址带端口,例子:http://localhost:8080/ </param>
        /// <param name="folderPath">需要代理的文件夹,例子:AppDomain.CurrentDomain.BaseDirectory + "offline-exam-player" </param>
        public ProxyHelper(string serviceIp, string folderPath)
        {
            _rootDirectory = folderPath;

            _listener = new HttpListener();
            _listener.Prefixes.Add(serviceIp);
        }

        public async Task Start()
        {
            _listener.Start();

            await Task.Run(() => ProcessRequests());

        }

        public void Stop()
        {
            _listener.Stop();
            _listener.Close();
            Console.WriteLine("Proxy server stopped.");
        }

        private void ProcessRequests()
        {
            try
            {
                while (_listener.IsListening)
                {
                    HttpListenerContext context = _listener.GetContext();
                    string requestPath = context.Request.Url.AbsolutePath;
                    string filePath = _rootDirectory + requestPath;

                    // Serve the requested file if it exists
                    if (System.IO.File.Exists(filePath))
                    {
                        string extension = System.IO.Path.GetExtension(filePath);
                        string contentType;
                        switch (extension)
                        {
                            case ".html":
                                contentType = "text/html";
                                break;
                            case ".js":
                                contentType = "application/javascript";
                                break;
                            case ".less":
                            case ".css":
                                contentType = "text/css";
                                break;
                            case ".svg":
                                contentType = "image/svg+xml";
                                break;
                            default:
                                contentType = "application/octet-stream";
                                break;
                        }

                        context.Response.ContentType = contentType;
                        //context.Response.ContentType = "text/html";
                        byte[] responseBuffer = System.IO.File.ReadAllBytes(filePath);
                        context.Response.OutputStream.Write(responseBuffer, 0, responseBuffer.Length);
                        context.Response.Close();
                    }
                    else
                    {
                        // Return a 404 response if the file does not exist
                        context.Response.StatusCode = 404;
                        context.Response.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                // Handle any exceptions that may occur
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

 

结语

最后如果对于不多的跨域js文件,可以把js的代码内嵌到index.html页面实现。就是<script>跨域js内容</script>文章来源地址https://www.toymoban.com/news/detail-833132.html

到了这里,关于c#使用webView2 访问本地静态html资源跨域Cors问题 (附带代理服务helper帮助类)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot代理访问本地静态资源400 404

    问题:访问过程中可能会出现400、404问题 前提:保证有文件,并且文件路径正确 SpringBoot如何配置静态资源代理,大家可以网上找一找,或者也可以参考我的另一篇博客 SpringBoot addResourceHandlers 代理静态资源 1、路径纯英文 此种情况目前没有遇到过问题 2、路径包含中文 此种

    2024年02月12日
    浏览(57)
  • 【小沐学C#】WPF中嵌入web网页控件(WebBrowser、WebView2、CefSharp)

    使用 Windows Presentation Foundation (WPF),你可以创建适用于 Windows 且具有非凡视觉效果的桌面客户端应用程序。 WPF 的核心是一个与分辨率无关且基于矢量的呈现引擎,旨在充分利用现代图形硬件。 WPF 通过一套完善的应用程序开发功能对该核心进行了扩展,这些功能包括可扩展应

    2024年02月03日
    浏览(56)
  • WPF混合开发之WebView2(二) WebView2的简单使用

    在上一篇文章中,我们介绍了WebView2的环境搭建,点此前往,在这一章节,我们将使用WebView2简单搭建一个WPF程序,在程序中加载百度搜索页面,废话不多说,直接上流程。 建立WPF工程 建立WPF工程步骤很简单,在此不再截图,直接上步骤: 打开Visual Stido 2022(博主使用的是vs

    2024年02月05日
    浏览(73)
  • 【仿写tomcat】五、响应静态资源(访问html页面)、路由支持以及多线程改进

    如果我们想访问html页面其实就是将本地的html文件以流的方式响应给前端即可,下面我们对HttpResponseServlet这个类做一些改造 writeHtml这个方法将会读取webApp下面的html文件,注意只读取下面一级文件中的html文件,然后将这个文件以二进制流的形式转换成字符串拼接到上面定义的

    2024年02月12日
    浏览(45)
  • WPF中使用WebView2控件

    WebView2 全称 Microsoft Edge WebView2 控件,此控件的作用是在本机桌面应用中嵌入web技术(html,css,javascript),从名字就可以看出来WebView2使用了Edge内核渲染web内容。 通俗来说,WebView2控件是一个UI组件,允许在桌面应用中提供web能力的集成,即俗称的混合开发。 助力程序开发和

    2024年02月03日
    浏览(47)
  • express静态资源访问错误 xxx.js was blocked due to MIME type (“text/html“)

    归根结底原因是没有静态资源xxx.js的访问权限 如何在express中给静态资源添加访问权限,我在express js中添加以下语句解决了该问题: 此时访问public文件夹中的xxx.js文件时,只需要使用路径 http://127.0.0.1/xxx.js 即可访问,路径中不需要带public ---------------------------------------------

    2024年02月22日
    浏览(47)
  • C++ 在Win32中简单使用WebView2

    Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎,以在本机应用中显示 web 内容。 使用 WebView2 可以在本机应用的不同部分嵌入 Web 代码,或在单个 WebView2 实例中生成所有本机应用。可以去官网查看具体

    2024年02月06日
    浏览(45)
  • 记录使用nginx部署静态资源流程,以及遇到的访问静态资源404问题

    将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署实现 动静分离 ,提高用户访问静态代码的速度,降低对后台应用访问,减轻后台服务器的压力。 这里我选择放在了 html文件夹 下,(也可以放在和html文件夹同级,或其它位置 打开 conf文件夹 打开总配置文

    2024年02月08日
    浏览(64)
  • c# 通过webView2模拟登陆小红书网页版,解析无水印视频图片,以及解决X-s,X-t签名验证【2023年4月29日】

    一、c# WebView2简介   1.一开始使用WebBrowser,因为WebBrowser控件使用的是ie内核,经过修改注册表切换为Edge内核后, 发现Edge内核版本较低,加载一些视频网站提示“浏览器版本过低“,”视频无法加载“。 2.WebBrowser内核版本与WebView2比较 WebBrowser内核版本: 内核版本 (Version) E

    2024年02月05日
    浏览(63)
  • 一.Winform使用Webview2(Edge浏览器核心) 创建demo(Demo1)实现回车导航到指定地址

    往期相关文章目录 专栏目录 WinForms 应用中的 WebView2 入门 按照官方文档一路操作,可以自行百度或者查看WinForms 应用中的 WebView2 入门。为了避坑,本人安装的时vs2022(visual studio 以下简称vs) 打开vs(visual studio 以下简称vs) 点击 创建新项目 ,选择 C# Windows 窗体应用 (.NET Framework

    2024年02月21日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包