Объект тела web-api POST всегда равен нулю при отправке данных из angular

У меня есть веб-API .Net Core 2.2, который прослушивает интерфейс angular. Я отправляю данные JSON на сервер из службы angular, я проверяю данные как в инструментах разработчика Chrome, так и в скрипаче, поэтому у меня есть хорошее представление о том, что отправляется. Конечная точка попадает, но тело не анализируется, и мой сервер считает, что оно пустое. Я просмотрел похожие проблемы, с которыми сталкивались люди с переполнением стека, но ни одно из их решений, похоже, не работает (FormBody, изменение отправленных данных и т. д.). Вот данные моего пакета из Fiddler, мой интерфейсный код и мой webAPI/viewmodel. Я помещаю точку останова в свою конечную точку С#, и она срабатывает, но объект «testInstance» всегда равен нулю. Любая идея, почему это, может быть, кодировка символов?

Данные скрипача

Сырой:

POST https://localhost:44380/api/Shipping/shippingDoc HTTP/1.1
Host: localhost:44380
Connection: keep-alive
Content-Length: 16
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
Origin: https://localhost:44380
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36
Content-Type: application/json; charset=UTF-8
Referer: https://localhost:44380/dataentry
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

{"name":"hello"}

Текстовый вид:

{"name":"hello"}

Внешний интерфейс Angular 8:

@Injectable({
  providedIn: 'root'
})
export class ShippingService {

  private shippingURL : string = 'api/Shipping/shippingDoc';
  constructor(private http: HttpClient) { }

  postShippingDocForm(shippingDoc : ShippingDoc) : Observable<any> {
    var headers = new HttpHeaders().set('Content-Type', 'application/json; charset=utf-8');
    var test = {name: "hello"} //dummy data
    return this.http.post(this.shippingURL, test, {headers: headers});
  }
}

Основной веб-API .Net:

namespace TrackingSystem.Controllers
    {
        [Route("api/Shipping")]
        public class ShippingController : ControllerBase
        {

            [HttpPost("shippingDoc")]
            [ProducesResponseType(StatusCodes.Status201Created)]
            [ProducesResponseType(StatusCodes.Status400BadRequest)]
            public ActionResult<Views.Shipping.Test> CreateShippingDocForm(Views.Shipping.Test testInstance) 
            {
                return testInstance; //breakpoint is here
            }

        }
    }

Модель основного представления .Net:

namespace TrackingSystem.Views.Shipping
{
    public class Test
    {
        public string name { get; set; }
    }
}

🤔 А знаете ли вы, что...
Фреймворк Angular имеет большое количество сторонних библиотек и расширений для расширения функциональности.


1
3 112
1

Ответ:

Решено

Чтобы правильно связать JSON в ASP.NET Core, вы должны изменить свое действие, чтобы включить атрибут [FromBody] в параметр. Это говорит платформе использовать заголовок типа содержимого запроса, чтобы решить, какой из настроенных IInputFormatters использовать для привязки модели.

public ActionResult<Views.Shipping.Test> CreateShippingDocForm([FromBody] Views.Shipping.Test testInstance) 
{
    return testInstance; //breakpoint is here
}