dotnet 默认创建的 JsonContent 没有 Content Length 的内容头

news/2024/11/16 12:30:26/文章来源:https://www.cnblogs.com/lindexi/p/18377448

本文记录一个 dotnet 的设计问题,默认创建出来的 JsonContent 对象的 Headers 里,是没有 Content-Length 信息的

如下面代码创建一个 JsonContent 对象

using System.Net.Http.Json;var foo = new Foo();var jsonContent = JsonContent.Create(foo);class Foo
{public int Value { set; get; }
}

此时如果遍历 JsonContent 的 Headers 属性,将只可以拿到 Content-Type 信息,没有 Content-Length 信息

在现代的绝大部分服务端,都是支持 Content 不带 Content-Length 信息的,这在大部分后台上都能正常符合预期工作

即使用大概如下代码的 JsonContent 发送出去的请求,在请求里面也是不带 Content-Length 信息的

    var foo = new Foo();var jsonContent = JsonContent.Create(foo);var httpClient = new HttpClient();await httpClient.PostAsync("https://blog.lindexi.com", jsonContent);

那如何可以让 JsonContent 带上 Content-Length 信息?只需调用 LoadIntoBufferAsync 方法,如以下代码

var jsonContent = JsonContent.Create(foo);await jsonContent.LoadIntoBufferAsync();

调用完成 LoadIntoBufferAsync 方法,即可在 Headers 里面看到 Content-Length 信息,且使用如下代码发送请求也是带上 Content-Length 信息的

    await jsonContent.LoadIntoBufferAsync();var httpClient = new HttpClient();await httpClient.PostAsync("https://blog.lindexi.com", jsonContent);

我查看请求的信息是通过自己创建一个简单的 ASP.NET Core 程序,代码大概如下

var builder = WebApplication.CreateSlimBuilder(args);var app = builder.Build();app.MapPost("/", async context =>
{await Task.CompletedTask;var headers = context.Request.Headers;
});app.Run();

通过断点在 var headers = context.Request.Headers; 即可了解客户端请求发送过来的请求头信息

以及将此请求尝试发送到其他服务器上,通过抓包确定了具体的行为

这在 dotnet 里面认为设计如此,且认为如果没有足够多的报告说缺少 Content-Length 信息会让后台不工作,则依然保持此行为

讨论内容请看:

.NET 6: JsonContent.Create(obj) should set Content-Length HTTP request header · Issue #70793 · dotnet/runtime

Content-Length not appended when using JsonContent · Issue #82984 · dotnet/runtime

Provide better json support for servers don't support chunked request body (re-open) · Issue #55583 · dotnet/runtime

本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 1b312eb1bfb867e56c5bbc61df720819fe1e15fc

以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 1b312eb1bfb867e56c5bbc61df720819fe1e15fc

获取代码之后,进入 Workbench/CaiballkaylecaWairlaroweneno 文件夹,即可获取到源代码

更多技术博客,请参阅 博客导航

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786456.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Programming from the Ground Up》阅读笔记:p95-p102

《Programming from the Ground Up》学习第6天,p95-p102总结,总计8页。 一、技术总结 1.directive(伪指令) 很多资料喜欢把directive和instruction都翻译成“指令”,这样在看到指令这个词时就不知道到底指的是什么?这里参考其它人的做法,将directive称为“伪指令”。 2.re…

如何在 Nuxt 中动态设置页面布局

title: 如何在 Nuxt 中动态设置页面布局 date: 2024/8/24 updated: 2024/8/24 author: cmdragon excerpt: 摘要:本文介绍如何在Nuxt框架中通过设置setPageLayout函数动态调整页面布局,包括安装Nuxt、创建不同布局文件及中间件,并通过示例演示如何根据不同路径设置相应布局…

牛客小白月赛99

牛客小白月赛99\(A\) 牛客 NC275617 材料打印 \(AC\)\(by+a \times \min(x,y)\) 即为所求。点击查看代码 int main() {ll t,a,b,x,y,i;cin>>t;for(i=1;i<=t;i++){cin>>a>>b>>x>>y;cout<<b*y+a*min(x,y)<<endl;}return 0; }\(B\) …

SQL Server 数据库 优化 性能瓶颈

优化sql查询,分库分表,读写分离。 建立索引,分页,时间段不要太长(限制数量)。 升级电脑:固态硬盘,多个cpu,万兆网口。 超级大表等优化。一查询,磁盘 100%lock select * from xx (nolock) 预防为主,测试为重。 建立模拟环境(测试环境),一模一样的应用环境,提前测…

线性dp:大盗阿福(打家劫舍)

大盗阿福本题与leetcode198题——打家劫舍的题意一模一样,阅读完本文以后可以尝试以下题目力扣题目链接) 题目叙述: 阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。这条街上一共有N家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时…

Nexpose v6.6.266 for Linux Windows - 漏洞扫描

Nexpose v6.6.266 for Linux & Windows - 漏洞扫描Nexpose v6.6.266 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Aug 21, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:…

扫描线总结

扫描线是线段树的典型应用。这玩意不难,用途也比较狭窄,重点在理解思想。例 0 【模板】扫描线 题意 求 \(n\) 个四边平行于坐标轴的矩形的面积并。 对于 \(100\%\) 的数据,\(1 \le n \le {10}^5\),\(0 \le x_1 < x_2 \le {10}^9\),\(0 \le y_1 < y_2 \le {10}^9\)。…

Pollard-Rho学习笔记

1.利用最大公约数求出一个约数 n和某个数的公约数一定是n的约数,即\(\forall k \in\mathbf{N}_{+},\gcd(k,n) \mid n\),只要选取适当的k使得\(1<\gcd(k,n)< n\),,就能够求得n的一个约数 满足这个条件的k很多,n的因数的大部分倍数都可行 我们通过\(f(x)=(x^2+c)\bmod…

DaVinci Resolve Studio 19.0 正式版 (macOS, Windows) - 剪辑、调色、特效和音频后期制作

DaVinci Resolve Studio 19.0 正式版 (macOS, Windows) - 剪辑、调色、特效和音频后期制作DaVinci Resolve Studio 19.0 正式版 (macOS, Windows) - 剪辑、调色、特效和音频后期制作 Blackmagic Design DaVinci Resolve Studio 请访问原文链接:https://sysin.org/blog/davinci…

读软件开发安全之道:概念、设计与实施07密码学(上)

密码学1. 加密工具 1.1. 加密工具之所以没有得到充分使用,就是因为人们往往认为密码学是一个准入门槛极高的专业领域 1.2. 如今的加密学大部分都源自纯数学,所以只要能够正确使用,加密学确实行之有效1.2.1. 不代表这些算法本身确实无法破解,而是需要数学领域出现重大突破才…