415-Unsupported-Media-Type при отправке формы с использованием ajax на ASP. NET Core 3.1 контроллер - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть проект ASP. NET Core 3.1, где я проверяю формы, используя jQuery -Unobtrusive и jQuery -Unobtrusive- AJAX. Когда форма отправлена, я получаю сообщение об ошибке HTTP 415.

Ниже приведен код моего контроллера.

[Route("api/[controller]"), ApiController]
public class ScheduleController : ControllerBase
{
    private readonly IEmailSender Emailer;

    public ScheduleController(IEmailSender emailer)
    {
        Emailer = emailer;
    }

    [HttpPost(Name = "Schedule"), ValidateAntiForgeryToken]
    public async Task<ActionResult<bool>> Schedule([FromBody]Schedule viewModel)
    {
        if (!ModelState.IsValid)
        {
            return Problem(false);
        }

        bool sent = await Emailer.SendEmailAsync("Schedule Request", viewModel.GetMessage());

        return Ok(sent);
    }
}

Вот урезанная версия моей формы

<form asp-route="Schedule" data-ajax="true" data-ajax-method="POST" data-ajax-begin="onBegin" data-ajax-failure="onFailed" data-ajax-success="onSuccess">
@* fields... *@
</form>

Я попытался изменить [FromBody] на [FromForm] и попытался удалить его полностью, но, похоже, ничего не исправляет эту ошибку.

Вот необработанный заголовок запроса

Host: localhost:1234
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 330
Origin: https://localhost:1234
Connection: keep-alive
Cookie: [Removed from simplicity]

Здесь это необработанное тело запроса

PropertyId=123&Date=4%2F11%2F2020+12%3A00%3A00+AM&Time=4%2F10%2F2020+11%3A00%3A00+AM&Phone=(123)+456-7890&Email=&__RequestVerificationToken=CfDJ8K77JmNhv79HurCngEMVfZh4LUSvtnAQfHGD3p3cO5bsB1NgI--P5JuhfG62F5igdXq2ers_V7MoMDFNVQTVuF9qGqTslDTkDPdcqIFD4wUkREhD6vHvSrdbqT24LWXTfr9Nu124A2OVAlJZa_xLCvs&X-Requested-With=XMLHttpRequest

1 Ответ

1 голос
/ 10 апреля 2020

Код ответа об ошибке клиента HTTP 415 Unsupported Media Type указывает, что сервер отказывается принять запрос, поскольку формат полезной нагрузки имеет неподдерживаемый формат.

Возможно, проблема с форматом вызвана запросом указано Content-Type или Content-Encoding, либо в результате прямой проверки данных.

Когда ваш Content-Type равен application/x-www-form-urlencoded, вы должны изменить [FromBody] на [FromForm].

Если вы используете [FromForm], добавьте [Consumes("application/x-www-form-urlencoded")] в действие, чтобы принять application/x-www-form-urlencoded тип контента

[Consumes("application/x-www-form-urlencoded")]
[HttpPost(Name = "Schedule"), ValidateAntiForgeryToken]
public async Task<ActionResult<bool>> Schedule([FromForm]Schedule viewModel)
{
    if (!ModelState.IsValid)
    {
        return Problem();
    }

    bool sent = await Emailer.SendEmailAsync("Schedule Request", viewModel.GetMessage());

    return Ok(sent);
}

ConfigureService

services.AddMvc(config =>
    {
        // Add XML Content Negotiation
        config.RespectBrowserAcceptHeader = true;
        config.ReturnHttpNotAcceptable = true;
        config.InputFormatters.Add(new XmlSerializerInputFormatter());
        config.OutputFormatters.Add(new XmlSerializerOutputFormatter());
    });

this ссылка может быть полезна для вас.

если вам нужно использовать [FromBody], вы должны изменить Content-Type на application/json вместо application/x-www-form-urlencoded.

...