You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C# WebView2中集成本地服务加载含YouTube iframe的本地HTML文件

在C#应用中集成本地静态文件服务替代Live Server

当然可以,你可以在C#应用中直接集成轻量的本地静态文件服务,完全不需要依赖VS Code和Live Server。下面提供两种实用方案:

方案一:使用.NET原生HttpListener(轻量桌面端方案)

HttpListener是.NET自带的类,无需额外安装包,适合快速搭建轻量静态文件服务器。

实现代码示例

using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;

public class LocalStaticServer
{
    private HttpListener _listener;
    private readonly string _rootPath;
    private readonly int _port;

    public LocalStaticServer(string rootPath, int port = 5500)
    {
        _rootPath = rootPath;
        _port = port;
        _listener = new HttpListener();
        _listener.Prefixes.Add($"http://localhost:{port}/");
        _listener.Prefixes.Add($"http://127.0.0.1:{port}/");
    }

    public async Task StartAsync()
    {
        _listener.Start();
        Console.WriteLine($"本地服务器已启动:http://localhost:{_port}");

        while (_listener.IsListening)
        {
            var context = await _listener.GetContextAsync();
            _ = HandleRequestAsync(context);
        }
    }

    private async Task HandleRequestAsync(HttpListenerContext context)
    {
        string filePath = context.Request.Url.LocalPath;
        filePath = filePath.TrimStart('/');
        if (string.IsNullOrEmpty(filePath)) filePath = "testvideo.html"; // 默认加载首页

        string fullPath = Path.Combine(_rootPath, filePath);

        if (!File.Exists(fullPath))
        {
            context.Response.StatusCode = (int)HttpStatusCode.NotFound;
            await context.Response.OutputStream.WriteAsync(System.Text.Encoding.UTF8.GetBytes("404 Not Found"));
            context.Response.Close();
            return;
        }

        // 设置响应内容类型
        string mimeType = GetMimeType(Path.GetExtension(fullPath));
        context.Response.ContentType = mimeType;

        // 读取文件并返回
        byte[] buffer = File.ReadAllBytes(fullPath);
        context.Response.ContentLength64 = buffer.Length;
        await context.Response.OutputStream.WriteAsync(buffer, 0, buffer.Length);
        context.Response.Close();
    }

    private string GetMimeType(string extension)
    {
        return extension.ToLower() switch
        {
            ".html" => "text/html",
            ".css" => "text/css",
            ".js" => "application/javascript",
            ".png" => "image/png",
            ".jpg" => "image/jpeg",
            _ => "application/octet-stream"
        };
    }

    public void Stop()
    {
        _listener?.Stop();
        _listener?.Close();
        Console.WriteLine("本地服务器已停止");
    }
}

在你的WebView2应用中使用

  1. 把你的HTML文件(比如testvideo.html)和相关资源放在应用的输出目录下(右键文件→属性→复制到输出目录:如果较新则复制)
  2. 在应用启动时初始化并启动服务器:
var server = new LocalStaticServer(AppDomain.CurrentDomain.BaseDirectory);
_ = server.StartAsync();

// 配置WebView2地址
webView21.Source = new Uri("http://localhost:5500/testvideo.html");

// 应用关闭时停止服务器
Application.ApplicationExit += (s, e) => server.Stop();

方案二:使用ASP.NET Core最小API(功能更丰富)

如果需要更完善的静态文件支持(比如缓存、路由规则),可以用ASP.NET Core搭建轻量服务器,适合需要扩展功能的场景。

实现步骤

  1. 在你的C#项目中安装NuGet包:Microsoft.AspNetCore.StaticFiles
  2. 添加服务器启动代码:
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

public class AspNetStaticServer
{
    private readonly int _port;
    private readonly string _rootPath;

    public AspNetStaticServer(string rootPath, int port = 5500)
    {
        _rootPath = rootPath;
        _port = port;
    }

    public async Task StartAsync()
    {
        var builder = WebApplication.CreateBuilder();
        builder.WebHost.UseUrls($"http://localhost:{_port}", $"http://127.0.0.1:{_port}");

        var app = builder.Build();

        // 配置静态文件服务
        app.UseStaticFiles(new StaticFileOptions
        {
            FileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider(_rootPath),
            RequestPath = ""
        });

        Console.WriteLine($"ASP.NET静态服务器已启动:http://localhost:{_port}");
        await app.RunAsync();
    }
}

集成到WebView2应用

var server = new AspNetStaticServer(AppDomain.CurrentDomain.BaseDirectory);
_ = server.StartAsync();

webView21.Source = new Uri("http://localhost:5500/testvideo.html");

注意事项

  • 打包应用时,确保HTML文件和相关资源(CSS/JS)被包含在发布包中
  • 选择端口时尽量避免冲突(比如5500是Live Server默认端口,也可以换成其他端口如8080)
  • WebView2需要正确安装运行时,发布应用时可以选择包含WebView2运行时

内容的提问来源于stack exchange,提问作者Terry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 07:43:10