ASP.NET Core Form POST дает ответ HTTP 415 Unsupported Media Type

Отправка запроса POST-запроса формы (Content-Type: application/x-www-form-urlencoded) к приведенным ниже результатам контроллера в ответ на сообщение HTTP 415 Unsupported Media Type.

public class MyController : Controller
{
    [HttpPost]
    public async Task<IActionResult> Submit([FromBody] MyModel model)
    {
        //...
    }
}

Опубликовать HTTP-заголовки:

POST /submit HTTP/1.1
Host: example.com:1337
Connection: keep-alive
Content-Length: 219
Pragma: no-cache
Cache-Control: no-cache
Origin: https://example.com:1337
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://example.com:1337/submit
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8,nl;q=0.6

Это использовалось для работы с ASP.NET MVC 5 на .NET 4.6.

Ответ 1

Для форм используйте атрибут [FromForm] вместо атрибута [FromBody].

Следующий контроллер работает с ASP.NET Core 1.1:

public class MyController : Controller
{
    [HttpPost]
    public async Task<IActionResult> Submit([FromForm] MyModel model)
    {
        //...
    }
}

Ответ 2

Вы можете использовать [FromBody], но вам нужно установить заголовок Content-Type вашего запроса на application/json, т.е.

Content-Type: application/json

Ответ 3

Сначала вам нужно указать в заголовках Content-Type, например, это может быть application/json.

Если вы установили тип контента application/json, вам нужно отправить json.

Таким образом, в body вашего запроса вы будете отправлять не form-data, не x-www-for-urlencoded а raw json, например {"Username": "user", "Password": "pass"}

Вы можете адаптировать пример к различным типам контента, включая то, что вы хотите отправить.

Вы можете использовать такой инструмент, как Postman или curl, чтобы поиграть с этим.

Ответ 4

Это мой случай: он запускает среду: контроллер AspNet Core 2.1:

public class MyController
{
    // ...

    [HttpPost]
    public ViewResult Search([FromForm]MySearchModel searchModel)
    {
        // ...
        return View("Index", viewmodel);
    }
}

Посмотреть:

<form method="post" asp-controller="MyController" asp-action="Search">
    <input name="MySearchModelProperty" id="MySearchModelProperty" />
    <input type="submit" value="Search" />
</form>

Ответ 5

В дополнение к хорошим ответам, вам не нужно использовать [FromForm] для получения данных формы в контроллере. Framework автоматически преобразует данные формы в модель по вашему желанию. Вы можете реализовать следующим образом.

[HttpPost]
public async Task<IActionResult> Submit(MyModel model)
{
    //...
}

Ответ 6

На классе Startup.cs

        services.AddMvcCore()
            .AddCors()

ОУ

        services.AddCors();

e adicionar:

        app.UseMvc(opt => {
            opt.ApplicationBuilder.UseCors(optCors => {
                optCors.AllowAnyHeader();
                optCors.AllowAnyOrigin();
            });
        });