HttpClient.SendAsyn c для параметра веб-API null - PullRequest
0 голосов
/ 02 февраля 2020

Я отправляю этот объект-член из внешнего интерфейса в API, но параметр становится пустым.

Я видел другие вопросы о параметре, всегда пустом , но мой - это не всегда ноль , оно работает большую часть времени, но если я пытаюсь добавить больше (дочерних) в Member, параметр API [FromBody] становится нулевым.

Это мой HttpClient to API

private async Task<HttpResponseMessage> SendToApi<T>(HttpMethod method, string requestUrl, T responseBody, string headerXData, bool extendRequest)
{
    var token = await _httpContextAccessor.GetAccessToken();

    var request = GetHttpRequestForApiCall(method, requestUrl, token, responseBody, headerXData, extendRequest);
    using (var cts = new System.Threading.CancellationTokenSource())
    {
        cts.CancelAfter(TimeSpan.FromSeconds(extendRequest ? _extendedTimeout : _timeout));
        /*
        var something = await request.Content.ReadAsByteArrayAsync();
        var jsonStr = Newtonsoft.Json.JsonConvert.DeserializeObject<MemberDtoModel>(Encoding.UTF8.GetString(something)); 
        works here, can deserialize to MemberDtoModel
        */
        return await HttpClient.SendAsync(request, cts.Token);
    }
}

РЕДАКТИРОВАНИЕ

protected HttpRequestMessage GetHttpRequestForApiCall<T>(HttpMethod method, string requestUrl, string bearerToken, T responseBody, string headerXData, bool extendRequest)
        {
            var request = new HttpRequestMessage(method, requestUrl);
            request.Headers.Add("Ocp-Apim-Subscription-Key", ApiSubscriptionKey);
            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", bearerToken);
            if (!string.IsNullOrWhiteSpace(headerXData))
            {
                request.Headers.Add("x-data", headerXData);
            }

            request.Content = CreateContent(method, responseBody);

            if (extendRequest)
            {
                request.Headers.Add("extendRequest", "true");
            }
            return request;
        }

        private HttpContent CreateContent<T>(HttpMethod method, T responseBody)
        {
            if (responseBody == null)
            {
                return null;
            }

            switch (responseBody)
            {
                case string stringBody:
                    if (!string.IsNullOrWhiteSpace(stringBody))
                    {
                        return new StringContent(stringBody, Encoding.UTF8, "application/json");
                    }
                    break;

                case ApiCommunicationContentModel contentBody:
                    if (method != HttpMethod.Get && contentBody?.Body != null)
                    {
                        var content = new ByteArrayContent(contentBody.Body);
                        content.Headers.ContentLength = contentBody.ContentLength;
                        content.Headers.Add("Content-Type", contentBody.ContentType);
                        return content;
                    }
                    else if (method != HttpMethod.Get && contentBody?.FileCollection != null)
                    {
                        var content = new MultipartFormDataContent(contentBody.ContentType.Split(';')[1]);
                        foreach (var item in contentBody.FileCollection)
                        {
                            var streamContent = new StreamContent(item.OpenReadStream());
                            streamContent.Headers.ContentLength = item.Length;
                            content.Add(streamContent, item.Name, item.FileName);
                        }
                        return content;
                    }
                    break;

                default:
                    throw new NotImplementedException();
            }
            return null;
        }

Это мой API

[HttpPost("Member")]
public async Task<IActionResult> SaveTemplate([FromBody] MemberDtoModel member) //here member becomes null
{
    await _memberService.SaveMember(member);
    return Ok(true);
}

Это из-за длины контента? Тот, у которого проблема, имеет длину содержимого 212208, но я уже установил

<requestLimits maxAllowedContentLength="55000000" />

Как его отладить? Что не так? Какими еще способами можно получить параметр MemberDtoModel в API

1 Ответ

0 голосов
/ 02 февраля 2020

Попробуйте установить для заголовка Content-Type значение "application/json" в вашем запросе.

...