Я создал пример проекта с использованием ASP. NET Core 3.1 Api project.
Сначала давайте посмотрим на контроллер и заметим атрибут ApiController, а также заметим атрибут FromRoute:
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.DataAnnotations;
namespace ValidationExampleApi.Controllers
{
[ApiController]
[Route("[controller]")]
public class ValidationController : ControllerBase
{
[HttpGet("{containername}/contentfiles/{fileName}")]
public bool Get([FromRoute]RequestModel request)//it will return 400 bad request if validation fails
{
if(ModelState.IsValid)//please note in this case this line will never be hit.
{
return false;
}
else
{
return true;
}
}
}
}
Теперь давайте посмотрим на модель и заметим аннотации данных с некоторыми техническими характеристиками проверки:
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.DataAnnotations;
namespace ValidationExampleApi.Controllers
{
public class RequestModel
{
[Required(AllowEmptyStrings = false)]
[StringLength(5, MinimumLength = 2)]
public string containername { get; set; }
[Required(AllowEmptyStrings = false)]
[StringLength(5, MinimumLength = 2)]
public string fileName { get; set; }
}
}
Теперь давайте посмотрим на мой класс запуска и заметим, что я добавил стандартную конфигурацию swashbuckle по умолчанию:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
namespace ValidationExampleApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// 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 V1");
c.RoutePrefix = string.Empty;
});
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
Теперь посмотрите на мое чванство, как оно показывает, что я нарушаю максимальную длину:
Заключительные примечания:
Вы также можете комбинировать параметры маршрута с параметрами запроса. Вы также можете применить атрибут «FromRoute» на уровне свойств в вашей модели. Есть много способов сделать это. Это просто пример «начала работы».
Настройка ответа об ошибке:
Здесь вы можете увидеть, как использовать обработчик ошибок, а также InvalidModelStateFactory и ValidationProblemDetails: Обработка ошибок Custom
Вот еще один пример использования InvalidModelStateFactory: Другой пример настройки ошибки