c# - 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 参数
解决方案
尝试在您的请求中将Content-Type
标头设置为。"application/json"
推荐阅读
- jquery - jQuery在尝试单击任意位置时关闭模式
- javascript - 聚合框架在 mongodb 中无法正常工作
- python - Facebook 从 image_hash 获取 AdImage url
- python-3.x - 颜色 = Color.query.all()
- reactjs - Reactjs 挂钩中的 Starter 需要从 column.js 组件中调用单击事件 openModal() ,其中事件在 Table.js 中定义
- c++ - 阻止铿锵格式断线
- python - Statsmodels 功效分析 观察次数
- python - 如何使用 KNeighbors 预测在 Google Vision OCR 中选择正确的文本位置?
- django - 仅在管理页面中获取以下内容
- macos - MacOS Safari 中的响应式 SVG 行为