【发布时间】:2021-02-28 19:10:28
【问题描述】:
我有一个在 Orange Pi 上的 Linux (Debian 10) 上运行的 .Net Core 5 控制台应用程序。 我正在尝试将一些 JSON 发布到 Web API(也用 .Net Core 5 编写并托管在 Azure App Service 上) API 有两个 HTTPPOST 端点 - 一个用于接收单个对象,另一个用于接收所述对象的数组。
当我将单个对象发布到第一个端点时,我会收到 201 Created 状态代码响应。但是当我发布相同对象的数组时,API 会返回 405 响应:
StatusCode:415,ReasonPhrase:“不支持的媒体类型”,版本:1.1, 内容:System.Net.Http.HttpConnectionResponseContent,标题:{
服务器:Microsoft-IIS/10.0 请求上下文:appId= X-Powered-By: ASP.NET 设置 Cookie: ARRAffinity=10f4677b6e2472959a213314a4f212e32905ecb3d38e1a47aefbb00645a0d541;Path=/;HttpOnly;Secure;Domain=eball-api.azurewebsites.net 设置 Cookie: ARRAffinitySameSite=10f4677b6e2472959a213314a4f212e32905ecb3d38e1a47aefbb00645a0d541;Path=/;HttpOnly;SameSite=None;Secure;Domain=eball-api.azurewebsites.net 日期:2021 年 2 月 28 日星期日 18:58:41 GMT 内容长度:175
内容类型:应用程序/问题+json;字符集=utf-8 }
这是我的控制台应用程序的样子:
public partial class ReadingDto
{
public int? Id { get; set; }
public DateTime? TimeReceived { get; set; }
public double? Frequency { get; set; }
public byte? FrequencyByte { get; set; }
public byte? Modulation { get; set; }
public byte? AGC1 { get; set; }
public byte? AGC2 { get; set; }
public string RawData { get; set; }
public bool? IsTest { get; set; }
public bool IsReported { get; set; }
public DateTime? TimeReported { get; set; }
}
private async Task PostReadings(List<ReadingDto> readingsDto)
{
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = "https://somedomain.com/api/";
string serializedObject = JsonSerializer.Serialize(readingsDto);
StringContent content = new StringContent(serializedObject);
using (var response = await httpClient.PostAsync("readings/batch", content))
{
Console.Write(response.IsSuccessStatusCode);
}
}
}
这就是 API 控制器中的 action 方法的样子:
[Route("api/[controller]")]
[ApiController]
public class ReadingsController : Controller
{
[HttpPost("batch")]
public async Task<IActionResult> PostReadings([FromBody] List<ReadingDto> readingsDto)
{
List<Reading> readings = _mapper.Map<List<Reading>>(readingsDto);
_context.Readings.AddRange(readings);
await _context.SaveChangesAsync();
return Created("GetReadings", readings);
}
}
有什么想法吗?我搜索了很多论坛,大多数建议替换此行:
StringContent content = new StringContent(serializedObject);
有了这个
StringContent content = new StringContent(serializedObject, Encoding.UTF8, "application/json");
但是当我这样做时,我得到了这个错误:
StatusCode:400,ReasonPhrase:“错误请求”,版本:1.1,内容: System.Net.Http.HttpConnectionResponseContent,标头:{
传输编码:分块服务器:Microsoft-IIS/10.0
请求上下文:appId= X-Powered-By:ASP.NET Set-Cookie: ARRAffinity=10f4677b6e2472959a213314a4f212e32905ecb3d38e1a47aefbb00645a0d541;Path=/;HttpOnly;Secure;Domain=eball-api.azurewebsites.net 设置 Cookie: ARRAffinitySameSite=10f4677b6e2472959a213314a4f212e32905ecb3d38e1a47aefbb00645a0d541;Path=/;HttpOnly;SameSite=None;Secure;Domain=eball-api.azurewebsites.net 日期:2021 年 2 月 28 日星期日 19:07:45 GMT 内容类型: 应用程序/问题+json;字符集=utf-8 }
【问题讨论】:
-
你能补充一下你是如何在body中构造json数组的
-
你需要发送字节内容,看看这个例子paddingleft.com/2018/04/11/…
-
发送请求的时候大家都用
ReadingCreateDto了吗?但是你为什么提供ReadingDto。我怀疑是错误的属性导致了这个错误。 -
@Karney。抱歉 - 这是创建此帖子时的复制粘贴错误 - 我已更正。
-
您应该将日志记录添加到接收已发布请求的 API 中,以便您可以解决此问题 - 由于您使用的是 Azure,Application Insights 将是最简单的。就目前而言,这个问题本质上是要求我们为您调试代码,这不是 Stack Overflow 的工作方式。
标签: c# .net-core httpclient webapi .net-5