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
相关产品推荐
相关产品推荐

