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

如何在ASP.NET Core 5+中通过ServiceStack提升文件上传大小限制

解决ASP.NET Core 5.0 + ServiceStack大文件上传限制问题

看起来你踩了ServiceStack和ASP.NET Core管道交互的一个常见坑——ServiceStack有自己独立的请求处理机制,直接用ASP.NET的[RequestSizeLimit]属性或者晚注册的中间件,往往绕不开它的内部限制。下面给你几个针对性的解决方案,按优先级从高到低排列:

1. 配置ServiceStack全局上传大小(最推荐)

ServiceStack自身有HostConfig来控制上传限制,这是优先级最高的设置,直接覆盖ASP.NET Core的默认值。在你的AppHost类里修改Configure方法:

public override void Configure(Container container)
{
    SetConfig(new HostConfig
    {
        // 设置允许的最大上传文件大小(300MB)
        MaxUploadSize = 300 * 1024 * 1024,
        // 可选:限制允许上传的文件扩展名,提升安全性
        AllowFileExtensions = new HashSet<string> { ".pdf", ".docx", ".zip" }
    });
}

2. 给单个服务方法设置专属限制

如果只需要给这个大文件上传接口单独放宽限制,可以用ServiceStack自带的[RequestSizeLimit]属性(注意是ServiceStack命名空间下的,不是ASP.NET的):

using ServiceStack;

[Route("/api/tehformz", "POST")]
public class BigFileUploadRequest : IReturn<ResponseStatus>
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string DeviceTypeId { get; set; }
}

// 给这个方法单独设置300MB的限制
[RequestSizeLimit(300 * 1024 * 1024)]
public ResponseStatus Post(BigFileUploadRequest request)
{
    // 获取上传的文件(ServiceStack的Request对象)
    var uploadedFiles = base.Request.Files;
    foreach (var file in uploadedFiles)
    {
        // 示例:保存文件到磁盘
        file.SaveTo($"./uploads/{file.FileName}");
    }
    return new ResponseStatus();
}

3. 修正ASP.NET Core的FormOptions配置

因为你用的是表单数据上传,ASP.NET Core的FormOptions也会限制多部分表单的大小,需要在Startup.cs的ConfigureServices里补充配置:

services.Configure<FormOptions>(options =>
{
    // 设置多部分表单的最大长度
    options.MultipartBodyLengthLimit = 300 * 1024 * 1024;
    // 其他相关限制也可以一并放宽
    options.ValueLengthLimit = int.MaxValue;
    options.MultipartHeadersLengthLimit = int.MaxValue;
});

4. 调整中间件的注册顺序

你之前的中间件没生效,大概率是因为它被注册在UseServiceStack之后了。ASP.NET Core中间件是按注册顺序执行的,如果ServiceStack已经先处理了请求,再修改MaxRequestBodySize就为时已晚。把中间件移到UseServiceStack前面:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 先注册你的自定义中间件
    app.Use(async (context, next) =>
    {
        var sizeFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();
        if (sizeFeature != null)
        {
            sizeFeature.MaxRequestBodySize = null; // 取消大小限制
        }
        await next();
    });

    // 再注册ServiceStack
    app.UseServiceStack(new AppHost());
}

把这几个步骤结合起来,应该就能顺利突破30MB的默认限制了。记得测试的时候用真正的大文件验证,避免缓存或者其他环境配置干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:18:09