首页 > 解决方案 > HttpClient.SendAsync 到 Web API 参数 null

问题描述

我正在将此成员对象从前端发送到 API,但参数变为 null。

我已经看到有关参数 always null的其他问题,但我的是它并不总是 null,它在大多数情况下都有效,但是如果我尝试将更多(子)添加到 Member 中,API [FromBody] 参数变为 null。

这是我的 HttpClient 到 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" />

应该怎么调试呢?怎么了?我可以通过哪些其他方式在 API 中获取 MemberDtoModel 参数

标签: c#asp.net-core-webapi

解决方案


尝试在您的请求中将Content-Type标头设置为。"application/json"


推荐阅读