无法构造"请求":使用 GET/HEAD 方法的请求不能有正文



我需要你的帮助。我正在学习开发api,所以我创建了一个Asp。. Net core 6 Api使用VS2022版本17.26。当我试图通过Swager测试我的API时,我得到了一个错误消息"未能构建'请求':请求与GET/HEAD方法不能有body"。

我试过邮差,我得到了另一个错误信息:

{
"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"

在过去的5天里,我一直在努力解决这个问题,但没有运气。

我的程序文件代码:

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();

我无法到达终点。

我想提一下,我正在使用(Ardalis.ApiEndpoints)包,我已经创建了两个端点Create和List。所以,当我运行API并测试Create EndPoint时,它工作得很好,但当我运行List EndPoint时,我得到了错误。我想可能是路由问题,我不确定。

文件夹:端点城市

创建端点:

namespace EA.Api.CityEndpoints
{
public class Create : EndpointBaseAsync
.WithRequest<CreateCityCommand>
.WithActionResult<CreateCityCommandResponse>
{
private readonly IMediator _mediator;
public Create(IMediator mediator)
{
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
}
[HttpPost(CreateCityCommand.Route)] //"api/cities"
[SwaggerOperation(
Summary = "Creates a new City",
Description = "Creates a new City",
OperationId = "cities.Create",
Tags = new[] { "CityEndpoints" })
]
public override async Task<ActionResult<CreateCityCommandResponse>>
HandleAsync([FromQuery] CreateCityCommand request, CancellationToken cancellationToken = default)
{
var response = await _mediator.Send(request);
return Ok(response);
}
}
}

端点列表:

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);
}
}
}
我找出了问题的原因,但仍然试图解决它。问题是由于使用MediatR引起的。因此,当我从列表端点中删除GetCitiesListQuery并使其无请求和无响应时,端点工作正常。把它们放回去,我又遇到了同样的问题。

我不知道为什么,但让我解释一下我是如何使用它的。也许有人能帮我指出我哪里做错了。

我的解决方案包含以下应用程序:

Asp.net Core Api

Api使用的包1.MediatR2. ardalis.apiendpoints3. autofac.extensions.dependencyinjection

类库ea .包含请求响应消息的命令和处理程序类的应用程序。

用于类库的包1.Autofac2. mediatr.extensions.autofac.dependencyinjecti

我在我的类库中有一个名为ApplicationModule的类,其中包含我在应用程序启动时在程序文件中注册的所有命令和处理程序类。

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;
}

如果有人知道这个问题,请告诉我。

您是否尝试过为列表端点放置调试器?

相关内容

最新更新