当前位置: 首页 > 知识库问答 >
问题:

发布对象数组时从Web API接收405 HTTP响应(.Net Core 5)

安建木
2023-03-14

我有一个。Net Core 5控制台应用程序在Orange Pi上的Linux(Debian 10)上运行。我正在尝试将一些JSON发布到Web API(也写在. Net Core 5中并托管在Azure应用服务上)API有两个HTTPPOSTendpoint-一个用于接收单个对象,另一个几乎相同的endpoint用于接收所述对象的数组。

当我将单个对象发布到第一个endpoint时,我会收到201创建的状态代码响应。但当我发布相同对象的数组时,API返回405响应:

StatusCode: 415, ReasonPhrase:'不支持的媒体类型',版本: 1.1,内容: System. Net. Http. HttpConnection响应内容,标题:{
服务器: Microsoft-IIS/10.0请求上下文: appId=X-Powerd-By: ASP. NET Set-Cookie: ARRAffinity=10f4677b6e2472959a213314a4f212e32905ecb3d38e1a47aefbb00645a0d541; Path=/; HttpOnly; Secure; Domain=eball-api.azurewebsites.netSet-Cookie: ARRAffinitySameSite=10f4677b6e2472959a213314a4f212e32905ecb3d38e1a47aefbb00645a0d541; Path=/; HttpOnly; SameSite=无;安全;域=eball-api.azurewebsites.net日期: Sun,28 Feb2021 18:58:41GMT内容长度: 175<

这就是我的控制台应用程序的外观:

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控制器中的动作方法:

[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");

但是当我这样做时,我得到了这个错误:

状态代码:400,原因短语:“错误请求”,版本:1.1,内容:系统。网Http。HttpConnectionResponseContent,标题:{
传输编码:分块服务器:Microsoft IIS/10.0
请求上下文:appId=X-Powered-By:ASP.NET Set Cookie:ARRAffinity=10f4677b6e2472959a213314a4f212e32905ecb3d38e1a47aefbb00645a0d541;路径=/;HttpOnly;安全;域=eball-api.azurewebsites.NET Set Cookie:ArraffinitySametite=10F4677B6E2472959A213314A4F212E32905ECB3D38E147AEFBB00645A0D541;路径=。/;HttpOnly;SameSite=无;安全;域=eball api。Azure网站。净日期:Sun,2021 2月28日19:07:45 GMT内容类型:应用程序/问题json;字符集=utf-8}

共有2个答案

齐意致
2023-03-14

我设法解决了这个问题。客户端使用的ReadingDto类和API使用的ReadingDto类之间略有不同。客户端版本的数据类型是一个可空整数,而API版本是一个不可空整数。所以客户端试图在Id字段中POST一个null,这是API不喜欢的。

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

向实
2023-03-14

我会通过使用System. Net中包含的PostAsJsonAsync来完全避免StringContent。https。格式化包:

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

此外,我建议使用IHttpClientFactory创建HttpClient。

 类似资料:
  • 问题内容: 我试图弄清楚如何将对象从表单发布到Web api服务。在我的控制器中,我定义了一个想要向其添加输入值的模型。 在我的输入字段中,我将它们绑定起来,例如: 在提交表单时,将这两个字段传递给我的服务并提交给我的WebApi 我已经通过两种方式尝试了此提交: 并且也如下,不声明参数 在webAPI中,我为帖子设置了一个方法 ReportLabel(dto)的定义如下: 我遇到的问题是,当我从

  • 在SSO实现中,在验证用户后,我创建了一个SAMLResponse对象,并使用IdentityProvider将其发布到默认登录URL。sendSamlResponseByHttpSt()方法。 身份提供程序。SendSamlResponseByHttpost(响应,strAssertionConsumerServiceURL,SamlRespossExml,relayState); SAML请求

  • 如果客户端发送给我“sales_tax”(而不是预期的“tax”),我应该返回什么。目前,我正在退回400英镑。但是,我开始质疑自己。我真的应该还422吗?我的意思是,它是JSON(它是受支持的),它是有效的JSON,它只是不包含所有必需的字段。

  • 问题内容: 我正在使用Angular $ resource将模型发布到webapi端点,但是Angular将数据发送到请求有效负载中,而不是JSON正文或表单参数中。结果,模型总是以null结尾。 我的API如下: 请求标头为: 和请求有效载荷: 如果我在Fiddler中进行测试,并在正文中发布相同的JSON字符串,则可以按预期正确填充模型。 是否有在这种情况下可以使用的内置模型活页夹,或者可以在

  • 我使用Angular$资源将模型发布到webapiendpoint,但Angular在请求负载中发送数据,而不是JSON正文或表单参数。因此,该模型最终总是为空。 我的API如下: 请求头包括: 和请求有效载荷: 如果我在Fiddler中进行测试,在主体中发布相同的JSON字符串,那么正如预期的那样,模型是正确填充的。 在这种情况下,是否有一个内置的模型绑定器可以工作,或者在我可以使用的地方预先构

  • 如何从Jackson在中生成的json响应中排除所有空json对象、数组或空对象的数组? 我正在为一个客户端构建一个Spring Boot REST API。API向数据库发送请求,并且必须生成JSON响应。 DAO层发送本机SQL查询,并以列表形式接收巨大的DB结果。开发人员必须使用索引手动将此结果映射到Java对象(参见下面的代码) SQL查询返回大量空值(这些查询不能修改)。由于这些空值,只