Неправильный запрос 400 для вызовов PUT Asp Net Web Api 2.2 - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь обновить свой ресурс из приложения Angular, совершая вызов Web Api с использованием метода PUT. По какой-то причине все, что я получаю, это ошибка 400 Bad Request, даже когда я пытаюсь сделать то же самое с помощью Postman.

Поэтому у меня есть два вопроса, первый - если следующий код верен, принимая во внимание веб. файл конфигурации, вывод на консоль, и второе - я должен как-то настроить свой IIS для разрешения вызовов PUT? Все работает на IIS, и до сих пор я встречался с blogpost, работая над этой проблемой, в которой упоминается что-то вроде этого - я действительно не знаю, что следует изменить. потому что мне кажется, что я удалил WebDAV в моем файле web.config.

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <location path="." inheritInChildApplications="false">
        <system.webServer>
            <modules runAllManagedModulesForAllRequests="true">
                <remove name="WebDAVModule"/>
            </modules>
            <handlers>
                <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
                <remove name="WebDAV" />
            </handlers>
            <aspNetCore processPath=".\AuctorAPI.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout"   />
        </system.webServer>
    </location>
</configuration>

метод обновления в моем угловом сервисе:

      updateClient(client: any) {

        console.log(client); 
        var obj = JSON.parse(client);



        const headers = new HttpHeaders().set('content-type', 'application/json');

        var body = {
          name: obj['name'],
          surname: obj['surname'],
          phone: obj['phone'],
          email: obj['email'],
          gymEntriesLeft: obj['gymEntriesLeft'], 
          martialArtsEntriesLeft: obj['martialArtsEntriesLeft'] 
        }

        console.log("ID");
        console.log(obj['id']);
        console.log("BODY");
        console.log(JSON.stringify(body));
        return this.http.put<Client>(this.url + obj['id'], JSON.stringify(body), { headers }).pipe(
          catchError(this.errorHandler)
        );
      }

Угловой компонент (вызов метода удаления)

    onFormSubmit()  {

        this.clientService.updateClient( this.clientById).subscribe(() => { 
          this.getClients();
          this.edit = false;
          this.editRowId = null;
        })

      }

Метод контроллера:

    // PUT: api/Clients/5
            [HttpPut("{id}")]
            public async Task<IActionResult> PutClient(int id, Client client)
            {
                if (id != client.Id)
                {
                    return BadRequest();
                }

                _context.Entry(client).State = EntityState.Modified;

                try
                {
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!ClientExists(id))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }

                return NoContent();
            }

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Решение найдено! Проблема заключалась в том, что в теле не было идентификатора, переданного в действие PUT. Я отладил его в Visual Studio, отправив запрос Postman, и, как это ясно написано в коде, неверный запрос возвращается только тогда, когда переданный идентификатор отличается от идентификатора объекта. Спасибо @AndriiLitvinov, я только что обнаружил, что когда вы разместили комментарий, но ваше решение было в пользу!

0 голосов
/ 04 ноября 2019

Кажется, что вам просто нужно передать идентификатор клиента в тело запроса, поскольку именно это проверяется в действии:

var body = {
  id: obj['id'],
  name: obj['name'],
  surname: obj['surname'],
  phone: obj['phone'],
  email: obj['email'],
  gymEntriesLeft: obj['gymEntriesLeft'], 
  martialArtsEntriesLeft: obj['martialArtsEntriesLeft'] 
}
...