c# - APIController FromBody arg 有时在放置请求上为空,但原始请求具有有效主体

标签 c# asp.net-core asp.net-core-mvc

我有一个类似于以下内容的 Controller :

[HttpPut]
[Route("")]
public async Task<IActionResult> Put([FromBody]List<MyObject> fromBody)
{
    if (fromBody == null)
        throw new InvalidOperationException($"{nameof(fromBody)} must not be null");

    // Unimportant junk
}

InvalidOperationException 在极少数情况下会在请求期间抛出。但是原始请求数据具有正确的内容和 header (我使用 raygun 进行异常报告,它捕获原始请求并且 json 内容在那里并且有效)。有什么原因会导致这种情况发生吗?

header 在成功请求和错误请求之间是相同的,如下所示(我的网站和任何 Azure id 已编辑):

Connection: "Keep-Alive"
Content-Type: "application/json;charset=utf-8"
Accept: "application/json;charset=utf-8"
Accept-Encoding: "gzip"
Host: "redacted"
Max-Forwards: "10"
User-Agent: "Dalvik/2.1.0 (Linux; U; Android 6.0.1; Nexus 5 Build/M4B30Z)"
Content-Length: "55392"
X-WAWS-Unencoded-URL: "redacted"
X-Original-URL: "redacted"
X-ARR-LOG-ID: "redacted"
DISGUISED-HOST: "redacted"
X-SITE-DEPLOYMENT-ID: "redacted"
WAS-DEFAULT-HOSTNAME: "redacted"
X-Forwarded-For: "redacted"
X-ARR-SSL: "redacted"
X-Forwarded-Proto: "https"
MS-ASPNETCORE-TOKEN: "redacted"
X-Original-For: "redacted"
X-Original-Proto: "http"

不幸的是,由于政策超出我的控制范围,我无法透露消息的实际正文,但它由 100% 有效的 json 对象数组组成,在 Content-Length 方面总长度正确。当我的客户端使用相同的内容/ header 进行重试时,它会成功。

我怀疑可能是超时请求还在进入controller,然后由于超时无法读取请求体。客户端是安卓设备,所以他们不断地进出互联网连接。但我不知道为什么在那种情况下它会进入 Controller 。

最佳答案

事实证明,Asp.NET Core 存在导致此行为的错误。

https://github.com/aspnet/Mvc/issues/7551

它已在 2.1.X+ 中修补,其中有预览版可用。

关于c# - APIController FromBody arg 有时在放置请求上为空,但原始请求具有有效主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47799667/

相关文章:

c# - C# 和 Java 之间溢出语义的差异

asp.net-core - GroupBy 自动映射器聚合

c# - 如何使用集群内反向代理自动确定在 Kubernetes 中运行的 ASP.NET Core 应用程序的 KnownNetworks?

sql-server - 如何在 Visual Studio 中创建与 SQL Server 的连接?获取 SqlException : Login failed for user

c# - 如何以编程方式提取 Windows Phone 的 LiveID?

c# - c# 根据用户输入选择mysql数据库

c# - Dapper ORM 的实用类类似于存储库模式

c# - 指定从 ASP.NET Core WebApi 提供服务的 Angular ClientApp 的基本 URL

query-string - Asp.net 5 mvc 6 获取查询字符串以查看

c# - 在测试中创建 UserManager<T> 的实例