httpClient.PutAsync () не обновляется, 415 неподдерживаемый тип носителя - PullRequest
0 голосов
/ 03 ноября 2019

Я создаю Rest API и Rest Client, URL-адрес API https://localhost:44341, а URL-адрес клиента https://localhost:44305/, в частности, я хочу иметь возможность редактировать страницы в клиенте для небольшой настраиваемой CMS.

В любом случае, чтобы просмотреть страницу в клиенте, я делаю это:

public async Task<IActionResult> Edit(long id)
{
    Page page = new Page();
    using (var httpClient = new HttpClient())
    {
        using var response = await httpClient.GetAsync("https://localhost:44341/api/Pages/" + id);
        string apiResponse = await response.Content.ReadAsStringAsync();
        page = JsonConvert.DeserializeObject<Page>(apiResponse);
    }
    return View(page);
}

И это работает, я получаю фактические данные страницы из API, однако метод PUT в клиентене работает, вот оно:

[HttpPost]
public async Task<IActionResult> Edit(Page page)
{
    using (var httpClient = new HttpClient())
    {
        using var response = await httpClient.PutAsync("https://localhost:44341/api/Pages/" + 
              page.Id, new StringContent(page.ToString()));

        string apiResponse = await response.Content.ReadAsStringAsync();
    }

    return Redirect(Request.Headers["Referer"].ToString());
}

Когда я отправляю форму для вышеуказанного метода, он просто перенаправляет на предыдущий запрос, но изменения не сохраняются.

Вот *Метод 1015 * из API:

[HttpPut("{id}")]
public async Task<ActionResult> PutPage(long id, Page page)
{
    if (id != page.Id)
    {
        return BadRequest();
    }

    context.Entry(page).State = EntityState.Modified;
    await context.SaveChangesAsync();

    return NoContent();
}

Когда я проверяю с использованием точек останова, я вижу, что response в методе POST говорит 415 unsupported media type

1 Ответ

1 голос
/ 04 ноября 2019

Код состояния 415 unsupported media type означает, что

Сервер отказывается обслуживать запрос, поскольку объект запроса находится в формате, не поддерживаемом запрашиваемым ресурсом для запрошенного метода.

Когда вы используете new StringContent(page.ToString()), тогда тип носителя для StringContent по умолчанию равен text / plain.

Вам необходимо отправить контент в формате json:

var content = new StringContent(JsonConvert.SerializeObject(page, Encoding.UTF8, "application/json");   
using var response = await httpClient.PutAsync($"https://localhost:44341/api/Pages/{page.Id}", content);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...