.NET 5 Blazor Server App ObjectResult Заголовок "Accept" не соблюдается

Я создаю контроллер в приложении.NET 5 Blazor Server, а OkObjectResult Я возвращаюсь из своего контроллера, всегда возвращает JSON, даже если я установил Accepts: application/xml.

Из-за получения правильного результата внутри моего обычая InvalidModelStateResponseFactory, Я склонен думать, что это может быть ошибка.

Startup.cs:

services
    .AddControllers(options =>
    {
        options.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
    })
    .ConfigureApiBehaviorOptions(options =>
    {
        options.InvalidModelStateResponseFactory = actionContext =>
        {
            KeyValuePair<string, ModelStateEntry> firstModelErrorPropertyName = actionContext.ModelState.First(s => s.Value.Errors.Count > 0);
            ModelError firstError = firstModelErrorPropertyName.Value.Errors.First();
            ObjectResult toReturn = new ObjectResult(new ErrorResponse
            {
                Status = RequestStatus.Fail,
                ErrorCode = ErrorCode.MissingParameter,
                ErrorDescription = $"Missing POST parameter: {firstModelErrorPropertyName.Key}: {"Description here"}"
            });

            toReturn.StatusCode = 200;

            return toReturn;
        };
    })
    .AddXmlSerializerFormatters()
    .AddXmlDataContractSerializerFormatters()
    .AddXmlOptions(options =>
    {
    })
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumMemberConverter());
    });

Контроллер:

/// <summary>
/// Enroll a member in IDCS services.
/// </summary>
/// <returns></returns>
[HttpPost("enroll")]
[Consumes("application/x-www-form-urlencoded")]
[FormatFilter]
public async Task<IActionResult> EnrollAsync(
     [FromForm] EnrollRequest req)
{
    return Ok(new
    {
        content = "Enroll"
    });
}

1 ответ

Решение

Я понял проблему сразу после публикации. Если я верну определенный объект:

return Ok(new EnrollmentSuccessResponse
    {
        Content = "Enroll"
    });

вместо анонимного объекта

return Ok(new
    {
        content = "Enroll"
    });

Все работает как положено.

Другие вопросы по тегам