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

ASP.NET Core 6 Web API GET请求含请求体报错求助

ASP.NET Core 6 Web API List端点报错排查求助

问题现象

  • Swagger测试List端点时,报错:Failed to construct 'Request': Request with GET/HEAD method cannot have body
  • Postman测试时返回400错误,响应内容:
{
    "errors": {
        "": [
            "A non-empty request body is required."
        ],
        "request": [
            "The request field is required."
        ]
    },
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "00-8dc5d67e871061e09d8d264769b31a9f-52123737ebab3abc-00"
}

排查背景

  • 使用VS2022 17.26版本开发ASP.NET Core 6 Web API,项目基于Ardalis.ApiEndpoints包
  • Create端点正常工作,仅List端点触发报错
  • 移除MediatR的GetCitiesListQuery后端点恢复正常,重新添加后问题重现,已排查5天未解决

项目结构与依赖

  • 包含ASP.NET Core Web API项目和EA.Application类库
  • API项目依赖:MediatR、Ardalis.ApiEndpoints、Autofac.Extensions.DependencyInjection
  • EA.Application类库依赖:Autofac、MediatR.Extensions.Autofac.DependencyInjection

关键代码片段

Program.cs

var CORS_POLICY = "CorsPolicy";

var config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(config)
    .MinimumLevel.Debug()
    .WriteTo.Console()
    .WriteTo.File("Logs/log-.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

var builder = WebApplication.CreateBuilder(args);

builder.Host.UseSerilog();

// Add services to the container.
builder.Services.AddControllers(options =>
{
    options.ReturnHttpNotAcceptable = true;
}).AddNewtonsoftJson()
.AddXmlDataContractSerializerFormatters();

// add DbContext
builder.Services.AddDbContext<AppDbContext>(options =>
    options
    .UseSqlServer(builder.Configuration.GetConnectionString("DataConnectionString"),
    sqlServerOptionsAction: sqloptions =>
    {
        sqloptions.EnableRetryOnFailure(
            maxRetryCount: 10,
            maxRetryDelay: TimeSpan.FromSeconds(5),
            errorNumbersToAdd: null);
    }));

builder.Services.AddControllers();

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// Call UseServiceProviderFactory on the Host sub property 
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
    containerBuilder.RegisterMediatR(typeof(Program).Assembly);
    containerBuilder.RegisterModule<ApplicationModule>();
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}


app.UseCors(CORS_POLICY);

app.UseHttpsRedirection();

// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), 
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API");

});

app.MapControllers();
app.Run();

List端点代码

namespace EA.Api.CityEndpoints
{
    public class List : EndpointBaseAsync
        .WithRequest<GetCitiesListQuery>
        .WithActionResult<List<CitiesListVm>>
    {
        private readonly IMediator _mediator;

        public List(IMediator mediator)
        {
            _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
        }

        [HttpGet(GetCitiesListQuery.Route)] //"api/cities"
        [SwaggerOperation(
            Summary = "List Cities",
            Description = "List Cities",
            OperationId = "cities.List",
            Tags = new[] { "CityEndpoints" })
        ]
        public override async Task<ActionResult<List<CitiesListVm>>> HandleAsync(GetCitiesListQuery request, 
            CancellationToken cancellationToken = default)
        {
            var dtos = await _mediator.Send(new GetCitiesListQuery());
            return Ok(dtos);
        }
    }
}

EA.Application相关代码

public class ApplicationModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<GetCitiesListQuery>().AsImplementedInterfaces();
        builder.RegisterType<GetCitiesListQueryHandler>().AsImplementedInterfaces();
    }
} 

public class GetCitiesListQuery : IRequest<List<CitiesListVm>>
{
    public const string Route = "/cities";
}

public class GetCitiesListQueryHandler : IRequestHandler<GetCitiesListQuery, List<CitiesListVm>>
{
    public async Task<List<CitiesListVm>> Handle(GetCitiesListQuery request, CancellationToken cancellationToken)
    {
        var allCities = (await _cityRepository.ListAllAsync()).OrderBy(x => x.CityNameEng);
        return _mapper.Map<List<CitiesListVm>>(allCities);
    }
}

public class CitiesListVm
{
    public int CityId { get; set; }
    public string CityNameEng { get; set; } = string.Empty;
    public string CityNameArb { get; set; } = string.Empty;
}

求帮忙排查问题原因并提供解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 03:16:04