在C#开发的服务端应用中,限制上传文件大小是避免服务器资源被恶意占用的常见需求。很多开发者在开发文件上传功能时,会遇到文件大小校验不生效、大文件上传报错等问题。本文将从配置层面和代码层面两个维度,详细介绍C#服务端控制上传文件大小的具体实现方法。

配置层面限制文件大小
ASP.NET Core应用配置
如果是ASP.NET Core应用,首先需要在程序启动时配置请求大小限制,默认情况下ASP.NET Core允许的最大请求体大小是30MB,我们可以通过修改Program.cs中的配置来调整这个限制。
var builder = WebApplication.CreateBuilder(args);
// 配置整个应用的最大请求体大小,这里设置为100MB
builder.Services.Configure<KestrelServerOptions>(options =>
{
options.Limits.MaxRequestBodySize = 100 * 1024 * 1024; // 100MB,单位字节
});
// 如果是IIS托管,还需要配置IISServerOptions
builder.Services.Configure<IISServerOptions>(options =>
{
options.MaxRequestBodySize = 100 * 1024 * 1024;
});
var app = builder.Build();
app.MapPost("/upload", async (IFormFile file) =>
{
// 上传逻辑
});
app.Run();
除了全局配置,还可以针对单个接口设置请求大小限制,使用RequestSizeLimit特性即可。
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class FileController : ControllerBase
{
// 针对这个接口单独设置最大请求大小为50MB
[HttpPost("upload")]
[RequestSizeLimit(50 * 1024 * 1024)]
public async Task<IActionResult> Upload(IFormFile file)
{
// 上传逻辑
return Ok();
}
}
传统ASP.NET MVC应用配置
如果是传统的ASP.NET MVC应用,需要在web.config中修改配置,调整允许上传的最大文件大小,默认的限制通常是4MB。
<configuration>
<system.web>
<!-- maxRequestLength单位是KB,这里设置为102400即100MB -->
<httpRuntime maxRequestLength="102400" executionTimeout="3600" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!-- maxAllowedContentLength单位是字节,这里设置为104857600即100MB -->
<requestLimits maxAllowedContentLength="104857600" />
</requestFiltering>
</security>
</system.webServer>
</configuration>
代码层面校验文件大小
配置层面的限制是全局或者接口级别的,为了更灵活的控制,我们还需要在代码层面校验上传文件的大小,比如针对不同的文件类型设置不同的大小限制。
ASP.NET Core中校验IFormFile大小
在ASP.NET Core的上传接口中,IFormFile对象提供了Length属性,直接获取文件的大小(单位字节),我们可以根据这个属性做判断。
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class FileController : ControllerBase
{
// 允许上传的最大文件大小,单位字节,这里设置为10MB
private const long MaxFileSize = 10 * 1024 * 1024;
[HttpPost("upload")]
public async Task<IActionResult> Upload(IFormFile file)
{
if (file == null || file.Length == 0)
{
return BadRequest("未检测到上传的文件");
}
// 校验文件大小
if (file.Length > MaxFileSize)
{
return BadRequest($"上传文件大小不能超过{MaxFileSize / 1024 / 1024}MB");
}
// 保存文件的逻辑
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "uploads", file.FileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
return Ok("文件上传成功");
}
}
传统ASP.NET中校验HttpPostedFileBase大小
在传统ASP.NET MVC中,上传的文件通过HttpPostedFileBase对象获取,同样可以通过ContentLength属性获取文件大小(单位字节)做校验。
using System.Web;
using System.Web.Mvc;
public class FileController : Controller
{
// 允许上传的最大文件大小,单位字节,这里设置为10MB
private const int MaxFileSize = 10 * 1024 * 1024;
[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
if (file == null || file.ContentLength == 0)
{
ViewBag.Message = "未检测到上传的文件";
return View();
}
// 校验文件大小
if (file.ContentLength > MaxFileSize)
{
ViewBag.Message = $"上传文件大小不能超过{MaxFileSize / 1024 / 1024}MB";
return View();
}
// 保存文件的逻辑
var filePath = Server.MapPath("~/uploads/" + Path.GetFileName(file.FileName));
file.SaveAs(filePath);
ViewBag.Message = "文件上传成功";
return View();
}
}
常见问题说明
- 配置层面的限制和代码层面的校验是互补的,配置层面可以拦截超过限制的大请求,避免进入接口逻辑浪费资源,代码层面可以做更细粒度的控制。
- 如果使用了反向代理(比如Nginx),还需要在反向代理层配置对应的请求大小限制,否则请求可能在到达C#服务端之前就被拦截。
- 文件大小的单位要注意区分,配置中有的用KB,有的用字节,代码中获取的大小通常是字节,转换时不要搞混。
C#文件上传文件大小限制IFormFileASP.NET_Core服务端校验修改时间:2026-06-13 14:57:18