【问题标题】:Receiving a 405 HTTP Response from Web API when posting an array of objects (.Net Core 5)发布对象数组时从 Web API 接收 405 HTTP 响应(.Net Core 5)
【发布时间】: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


【解决方案1】:

我会通过使用PostAsJsonAsync 完全避免StringContent,它包含在System.Net.Http.Formatting 包中:

await httpClient.PostAsJsonAsync("url", readingsDto);

另外,我建议使用IHttpClientFactory 创建HttpClient

【讨论】:

  • 你需要提一下,这不是 HttpClient 类的一部分……那是格式化扩展的一部分
【解决方案2】:

我设法找出了问题所在。客户端使用的 ReadingDto 类和 API 使用的 ReadingDto 类之间存在细微差别。客户端版本的数据类型是可空整数,而 API 版本是不可空整数。所以客户端试图在 Id 字段中发布一个空值,这是 API 不喜欢的。

我很抱歉浪费了大家的时间。不幸的是,我不能在办公时间从事这个项目,因为那时我正在工作,所以我必须在下班后工作(然后只有在我儿子睡着后(晚上 10 点左右))!这就是加班累累的问题!

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 2014-09-14
    • 2018-09-24
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多