核心思路
无论使用哪种技术,核心的 HTML 标签都是 <video>,我们的任务主要是在 ASP.NET 后端(C#)准备好视频文件的路径,然后将其传递给前端的 HTML 标签。

使用 HTML5 <video> 标签(最常用、最推荐)
这是最标准、最灵活的方式,无需任何第三方服务器控件,它利用了现代浏览器的原生视频播放能力。
步骤 1:准备工作
- 创建项目:在 Visual Studio 中创建一个 ASP.NET Web 应用程序(.NET Framework 或 .NET Core/5+ 都可以)。
- 添加视频文件:
- 在你的项目中创建一个文件夹,
~/Videos/。 - 将你的视频文件(
my_video.mp4)放入这个文件夹。 - 重要:在解决方案资源管理器中右键点击
Videos文件夹 -> 属性 -> 将 “复制到输出目录” 设置为 “如果较新则复制” 或 “始终复制”,这确保了视频文件在编译后能被正确部署到bin目录或publish目录下。
- 在你的项目中创建一个文件夹,
步骤 2:前端代码(.aspx 或 .cshtml)
在你的页面中,直接使用 HTML5 的 示例 1:使用硬编码路径(不推荐,但最简单) 示例 2:从后端动态获取路径(推荐做法) 这种方式更灵活,因为视频路径可以来自数据库、配置文件或根据用户选择动态变化。 WebForm1.aspx WebForm1.aspx.cs (后端代码) 这是 ASP.NET 提供的一个服务器端控件,它最终会渲染成标准的 HTML5 与方案一相同,确保视频文件在 WebForm2.aspx WebForm2.aspx.cs (后端代码) 如果视频文件非常大,或者视频内容(如标题、描述)存储在数据库中,直接提供文件链接可能不是最佳选择,这时,你可以使用 ASP.NET Generic Handler ( 在项目中添加一个新项,选择 “一般处理程序”,命名为 VideoHandler.ashx.cs WebForm3.aspx 对于初学者和大多数应用,方案一(HTML5 <video>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">视频播放示例</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<!--
controls: 显示播放控件(播放/暂停、进度条、音量等)
width/height: 设置播放器尺寸
autoplay: 自动播放(部分浏览器可能不允许)
muted: 静音后自动播放(通常允许)
-->
<video width="800" height="450" controls="controls">
<!--
推荐使用 <source> 标签,可以提供多种格式的视频,
浏览器会自动选择它支持的第一种格式。
-->
<source src="Videos/my_video.mp4" type="video/mp4" />
您的浏览器不支持 HTML5 视频播放。
</video>
</div>
</form>
</body>
</html>

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">动态视频路径</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<!-- 使用 ASP.NET 的 <%= %> 语法在服务器端执行代码并输出结果 -->
<video width="800" height="450" controls="controls">
<source src="<%= GetVideoPath() %>" type="video/mp4" />
您的浏览器不支持 HTML5 视频播放。
</video>
</div>
</form>
</body>
</html>
using System;
using System.Web.UI;
namespace WebApplication1
{
public partial class WebForm1 : Page
{
protected void Page_Load(object sender, EventArgs e)
{
// 页面加载时执行的操作
}
/// <summary>
/// 从后端获取视频文件的完整路径
/// </summary>
/// <returns>视频文件的 URL</returns>
public string GetVideoPath()
{
// Server.MapPath 将虚拟路径转换为服务器上的物理路径
// ~/Videos/my_video.mp4 -> C:\...\WebApplication1\Videos\my_video.mp4
// 为了在 HTML 中使用,我们需要将其转换为可公开访问的 URL 路径
// Request.ApplicationPath 获取应用程序的根路径,如 "/"
// 我们将物理路径转换为相对于应用程序根的虚拟路径
string virtualPath = "~/Videos/my_video.mp4";
// 使用 ResolveUrl 方法将带有 ~ 的路径转换为完整的、可用的 URL
// 这是最安全、最推荐的方式
return ResolveUrl(virtualPath);
// 或者手动拼接(不推荐,因为处理了根路径等情况)
// return Request.ApplicationPath + virtualPath.TrimStart('~');
}
}
}
使用 ASP.NET
Video 服务器控件<video> 标签,对于习惯使用服务器控件的开发者来说,这种方式可能更直观。步骤 1:准备工作
~/Videos/ 目录下,复制到输出目录”的属性已正确设置。
步骤 2:前端和后端代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication1.WebForm2" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">ASP.NET Video 控件</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<!--
asp:Video 控件
runat="server": 表示这是一个服务器控件
-->
<asp:Video ID="VideoPlayer" runat="server" Width="800" Height="450"
AutoPlay="False" AutoStart="False"
Controls="True"
EnableCrossDomain="False">
</asp:Video>
</div>
</form>
</body>
</html>
using System;
using System.Web.UI;
namespace WebApplication1
{
public partial class WebForm2 : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 设置视频源
// Video 控件的 Source 属性需要一个 URL
string videoPath = "~/Videos/my_video.mp4";
VideoPlayer.Source = ResolveUrl(videoPath);
}
}
}
}
从数据库中读取视频并流式传输(高级场景)
.ashx) 来从数据库读取视频数据并将其流式传输给浏览器。步骤 1:创建 Generic Handler
VideoHandler.ashx。using System;
using System.Data;
using System.Data.SqlClient;
using System.Web;
namespace WebApplication1
{
/// <summary>
/// 从数据库获取视频并流式传输的处理器
/// </summary>
public class VideoHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
// 1. 从 URL 参数中获取视频ID
string videoId = context.Request.QueryString["id"];
if (string.IsNullOrEmpty(videoId))
{
context.Response.StatusCode = 400; // Bad Request
context.Response.Write("Video ID is required.");
return;
}
// 2. 从数据库获取视频信息(这里用伪代码代替实际数据库连接)
// 假设你的数据库表结构为: Videos (VideoID int, VideoData varbinary(MAX), VideoName nvarchar(255), ContentType nvarchar(50))
byte[] videoData = null;
string contentType = "video/mp4"; // 默认类型,应根据实际视频设置
string videoName = "video.mp4";
// --- 伪数据库查询 ---
// using (SqlConnection con = new SqlConnection("Your_Connection_String"))
// {
// string query = "SELECT VideoData, ContentType, VideoName FROM Videos WHERE VideoID = @VideoID";
// SqlCommand cmd = new SqlCommand(query, con);
// cmd.Parameters.AddWithValue("@VideoID", int.Parse(videoId));
// con.Open();
// using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
// {
// if (reader.Read())
// {
// videoData = (byte[])reader["VideoData"];
// contentType = reader["ContentType"].ToString();
// videoName = reader["VideoName"].ToString();
// }
// }
// }
// --- 伪数据库查询结束 ---
// 为了演示,我们假设找到了一个视频文件并读取为字节数组
// 在实际应用中,videoData 将来自数据库查询
string filePath = context.Server.MapPath("~/Videos/my_video.mp4");
videoData = System.IO.File.ReadAllBytes(filePath);
if (videoData == null)
{
context.Response.StatusCode = 404; // Not Found
context.Response.Write("Video not found.");
return;
}
// 3. 设置响应头,告诉浏览器这是一个视频流
context.Response.Buffer = false; // 不缓冲,适合大文件流式传输
context.Response.Clear();
context.Response.ContentType = contentType;
context.Response.AddHeader("Content-Disposition", $"inline; filename=\"{videoName}\"");
context.Response.AddHeader("Content-Length", videoData.Length.ToString());
// 4. 将视频数据写入响应输出流
context.Response.BinaryWrite(videoData);
context.Response.Flush();
}
public bool IsReusable
{
get { return false; }
}
}
}
步骤 2:在前端页面调用 Handler
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="WebApplication1.WebForm3" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">从数据库流式传输视频</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<!--
视频的 src 指向我们的 Generic Handler,
并通过查询字符串传递视频 ID
-->
<video width="800" height="450" controls="controls">
<source src="VideoHandler.ashx?id=123" type="video/mp4" />
您的浏览器不支持 HTML5 视频播放。
</video>
</div>
</form>
</body>
</html>
总结与对比
方案
优点
缺点
适用场景
HTML5
<video>标准、灵活、性能好,与后端技术无关。
需要手动处理路径拼接。
绝大多数场景,特别是静态视频文件。
ASP.NET
Video 控件对 ASP.NET 开发者友好,属性化配置。
封装性稍强,不如原生
<video> 标签灵活。喜欢使用服务器控件,项目已大量使用 ASP.NET 控件。
Generic Handler (
.ashx)安全性高(可控制访问权限),适合大文件流式传输,可结合数据库动态管理视频。
实现复杂,需要额外处理程序。
视频存储在数据库、需要用户权限验证、或视频文件非常大的情况。
<video> 标签 + 后端动态路径)是最佳选择,因为它简单、高效且是行业标准。
