Фильтр асинхронных действий не работает. Базовый веб-API ASP.NETC#

Место общения программистов C#
Ответить
Anonymous
 Фильтр асинхронных действий не работает. Базовый веб-API ASP.NET

Сообщение Anonymous »

Я создал собственный «ValidationFilter», чтобы проверять запрос до того, как он достигнет контроллера, вот он:

Код: Выделить всё

ValidationFilter
класс

Код: Выделить всё

using Contracts.ViewModels;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace Middleware.Filters
{
public class ValidationFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
if (!context.ModelState.IsValid)
{
#pragma warning disable CS8602 // Dereference of a possibly null reference.
var errorsInModelState = context.ModelState
.Where(o => o.Value.Errors.Count > 0)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Errors.Select(o => o.ErrorMessage)).ToArray();
#pragma warning restore CS8602 // Dereference of a possibly null reference.

var errorResponse = new ErrorResponse();

foreach(var error in errorsInModelState)
{
foreach(var subError in error.Value)
{
var errorModel = new ErrorModel
{
FieldName = error.Key,
Message = subError
};

errorResponse.Errors.Add(errorModel);
}
}

context.Result = new BadRequestObjectResult(errorResponse);
return;
}

await next();
}
}
}
Есть простой Валидатор по запросу:

Код: Выделить всё

using Contracts;
using FluentValidation;

namespace Middleware.Validators
{
public class AddressingDtoValidator : AbstractValidator
{
public AddressingDtoValidator()
{
RuleFor(x => x.District)
.NotNull()
.NotEmpty()
.Matches("^[a-zA-Z0-9 ]*$");
RuleFor(x => x.Mr)
.NotNull()
.NotEmpty()
.Matches("^[a-zA-Z0-9 ]*$");
RuleFor(x => x.Quarter)
.NotNull()
.NotEmpty()
.Matches("^[a-zA-Z0-9 ]*$");
RuleFor(x => x.Street)
.NotNull()
.NotEmpty()
.Matches("^[a-zA-Z0-9 ]*$");
RuleFor(x => x.Building)
.NotNull()
.NotEmpty()
.Matches("^[a-zA-Z0-9 ]*$");
RuleFor(x => x.Corpus)
.NotNull()
.NotEmpty()
.Matches("^[a-zA-Z0-9 ]*$");
RuleFor(x => x.Building)
.NotNull()
.NotEmpty()
.Matches("^[a-zA-Z0-9 ]*$");
RuleFor(x => x.InstitutionName)
.NotNull()
.NotEmpty()
.Matches("^[a-zA-Z0-9 ]*$");
}
}
}
У меня также есть классы ErrorModel и ErrorResponse, которые вы можете увидеть ниже, и моя цель — отобразить ошибку с помощью этого класса, но почему-то это не работает:< /p>

Код: Выделить всё

ErrorModel

Код: Выделить всё

namespace Contracts.ViewModels
{
public class ErrorModel
{
public string? FieldName { get; set; }
public string? Message { get; set; }
}
}

Код: Выделить всё

ErrorResponse
класс

Код: Выделить всё

namespace Contracts.ViewModels
{
public class ErrorResponse
{
public List Errors { get; set;  } = new List();
}
}
Я хочу, чтобы ошибка отображалась следующим образом:

Код: Выделить всё

{
"errors": [
{
"fieldname": "....",
"message": "...."
}
]
}
но вместо этого я получаю что-то вроде этого:

Код: Выделить всё

{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-b9157268dc1f793004182694c1acf1a7-67fd063ebec5cbc3-00",
"errors": {
"Quarter": [
"'Quarter' must not be empty."
]
}
}
Я имею в виду, что этот тип ошибки понятен и его можно прочитать, но я практикуюсь с фильтрами действий, и что-то не работает.
Есть также Класс Program.cs, куда я добавляю этот валидатор в конвейер:

Код: Выделить всё

builder.Services.AddControllers(options =>
{
options.Filters.Add();
})
.AddFluentValidation(configuration => configuration.RegisterValidatorsFromAssemblyContaining());
Так в чем может быть проблема, я что-то упускаю?

Подробнее здесь: https://stackoverflow.com/questions/730 ... re-web-api
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»