HttpRequestMessage.Content имеет значение null при получении действия контроллера - PullRequest
0 голосов
/ 30 января 2019

Я просмотрел несколько похожих постов, но у всех были некоторые важные детали, которые не применимы в моем случае.У меня есть сервис Shopper с методом Register.Он построен на .NET Framework 4.6.1 Web API.У меня есть несколько рабочих сценариев, в которых другая служба веб-API .NET Framework 4.6.1 вызывает службу Shopper с использованием HttpClient и HttpRequestMessage.Я делаю это с помощью методов GET, PUT и POST и успешно передаю данные в методы PUT и POST, используя

request.Content = new ObjectContent<MemberAddress>(memberAddress, new System.Net.Http.Formatting.JsonMediaTypeFormatter());

. Сейчас я разрабатываю новый сервис, основанный на ASP.NET Core Web API,Я пытаюсь вызвать действие POST в сервисе Shopper.Я получаю свой HttpClient от IHttpClientFactory.CreateClient.Я думаю, что настройка HttpRequestMessage такая же, как и в других моих службах вызова.

        var request = new HttpRequestMessage(HttpMethod.Post, updateShopperUrl);
        request.Content = new ObjectContent<MemberRegistration>(memberRegistration, new System.Net.Http.Formatting.JsonMediaTypeFormatter(), "application/json");

Вызов службы выглядит следующим образом:

        var httpClient = _clientFactory.CreateClient();
        var response = await httpClient.SendAsync(request);

Я могу проверить request.Content.Value перед вызовом, и он содержит ожидаемый объект / данные.Код действия контроллера на другом конце выглядит следующим образом:

    [Route("{shopperId}/register")]
    [Route("~/api/shopper/{shopperId}/register")]
    [HttpPost]
    public IHttpActionResult RegisterNewMember(string shopperId, [FromBody] MemberRegistration memberRegistration)
    {

Но параметр memberRegistration всегда равен нулю.Атрибут [FromBody] является недавним дополнением в попытке решить эту проблему, но это не помогло.В любом случае FromBody должен быть поведением по умолчанию для параметра сложного объекта.Я могу POST к этой конечной точке с Почтальоном, и данные memberRegistration приходят через.

Либо я просто упускаю что-то очевидное, либо, может быть, что-то другое происходит в вызывающей стороне уравнения ASP.NET Core.

1 Ответ

0 голосов
/ 31 января 2019

Похоже, вы пытаетесь опубликовать данные в формате JSON

Попробуйте немного изменить подход и посмотрите, будет ли он иметь значение.

var json = JsonConvert.SerializeObject(memberRegistration);

var content = new StringContent(json, Encoding.UTF8,"application/json");

var httpClient = _clientFactory.CreateClient();

var response = await httpClient.PostAsync(updateShopperUrl, content);

Вышеприведенное вручную сериализует объект в JSON и отправляет его в веб-API.

Возможно, возникла проблема с форматером, используемым с ObjectContent

...