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

如何在ASP.NET Core集成测试中使用完整Kestrel服务器替代测试服务器?

在集成测试中使用真实Kestrel服务器解决请求体大小限制问题

当使用Microsoft.AspNetCore.Mvc.Testing包的测试服务器时,常规初始化代码如下:

var webAppFactory = new WebApplicationFactory<Program>();
var httpClient = webAppFactory.CreateClient();

此时测试服务器默认使用的是TestServer而非Kestrel,导致请求体大小限制这类依赖Kestrel的功能无法正常生效,会触发如下警告:

warn: Microsoft.AspNetCore.Mvc.Filters.RequestSizeLimitFilter[1]
A request body size limit could not be applied. This server does not support the IHttpRequestBodySizeFeature.

解决方案:配置WebApplicationFactory使用Kestrel

通过重写WebApplicationFactory的ConfigureWebHost方法,强制测试环境使用真实的Kestrel服务器:

1. 自定义WebApplicationFactory

创建继承自WebApplicationFactory<Program>的自定义工厂类,替换默认服务器为Kestrel:

public class KestrelWebApplicationFactory : WebApplicationFactory<Program>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        // 移除TestServer服务,注册Kestrel服务器
        builder.ConfigureServices(services =>
        {
            services.RemoveAll(typeof(IServer));
            services.AddSingleton<IServer, KestrelServer>();
        });

        // 可选:配置Kestrel监听规则,比如指定端口或启用HTTPS
        builder.UseKestrel(options =>
        {
            options.ListenLocalhost(5001); // 监听本地5001端口
        });
    }
}

2. 在测试中使用自定义工厂

将测试代码中的默认工厂替换为自定义的KestrelWebApplicationFactory:

var webAppFactory = new KestrelWebApplicationFactory();
var httpClient = webAppFactory.CreateClient();

额外提示

  • 可以在UseKestrel中配置和生产环境一致的参数,比如请求体大小限制、证书等,确保测试环境和生产环境行为一致。
  • 如果不指定固定端口,Kestrel会自动分配可用端口,CreateClient()会自动指向该端口,无需手动配置地址。

内容的提问来源于stack exchange,提问作者me.at.coding

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:03:18