首页 > 其他分享 >dotnet 默认创建的 JsonContent 没有 Content Length 的内容头

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

时间:2024-08-24 10:16:32浏览次数:12  
标签:JsonContent git 代码 Content Length var

本文记录一个 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

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

先创建一个空文件夹,接着使用命令行 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 文件夹,即可获取到源代码

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

标签:JsonContent,git,代码,Content,Length,var
From: https://www.cnblogs.com/lindexi/p/18377448

相关文章

  • url-&content=路径带中文,出现乱码,中文乱码
    httpget请求不能传输中文参数,http请求是不接受中文参数的。需要发送方,将中文参数encode,接收方将参数decodeURLEncoder.encode(msg,"UTF-8");StringdecodeUrl=URLDecoder.decode(encodeUrl,"utf-8");%E6%B5%8B%E8%AF%95%E4%B8%AD%E6%96%87%E4%B8%B2通过utf-8编码把中......
  • CSS fit-content属性:弹性布局的利器
    ......
  • WPF控件结构与Content理解
    WPF控件结构WPF中控件继承图我们平时所用的容器如Grid、StackPanel等都是继承Panel控件类型分为3组:内容控件、Items控件、TextBoxBase如何理解Content?凡是继承ContentControl的控件,定义内容为Content,除了TextBlock用text以外,大部分都是用Content设置显示类容。一个窗......
  • SOMEIP_ETS_042: echoUTF16DYNAMIC_length_too_short_for_String
    测试目的:验证设备(DUT)能否正确拒绝一个长度小于实际字符串长度的echoUTF16DYNAMIC字符串。描述本测试用例旨在检查当发送的SOME/IP消息中的echoUTF16DYNAMIC字符串长度小于实际字符串长度时,DUT是否能够返回格式错误(MALFORMED_MESSAGE)的错误消息。测试拓扑:具体步骤:TEST......
  • HexView 刷写文件脚本处理工具-命令行介绍(二)-对齐长度(/AL[:length])
    对齐长度(/AL[:length])这个选项与/AD参数结合使用非常有用。它也将所有块的长度对齐,使其成为/Adxx选项中给定参数的倍数。示例说明:/AD4/AL如果有一个地址范围从0xE432到0xE47E的块,它将被对齐到0xE430到0xE47F。所有的字符将被填充为0xFF,或者被/Afxx指......
  • Specified key was too long; max key length is 1000 bytes
    setglobalinnodb_large_prefix=1;setglobalinnodb_file_format=BARRACUDA;--auto-generateddefinitioncreatetablexxx_term(idintauto_incrementprimarykey,namevarchar(255)default''notnull,source_urlvarchar(500)......
  • Mysql的length函数,char_length函数与字符,字节的区别
    在存储中,1个英文单词或1个英文字符为1个1字节,1个中文或1个中文字符为3个字节 在Mysql5.0之前,VARCHAR(20)中的20表示20个字节,英文可以存储20个,但中文只能存储6个 在Mysql5.0之后,varchar(20)中的20表示20个字符,不管中文还是英文都可以存储20个 length()函数是查找字节数,CHAR_LENG......
  • ContentProvider
    目录运行截图:源码项目一:共享资源方项目二:请求资源方注意事项1.参考「持久化技术」的项目 ,创建一个对外的ContentProvider以供使用。2.新建一个应用程序,应用的名字自拟。3.应用程序中包含一个MainActivity,为默认登陆Activit......
  • HarmonyOS:如何实现自定义的Tabs,TabContent内部实现如何动态配置
    前言:最近做开发任务的时候,想把Tabs自定义了,并且动态配置TabContent里面的内容,不是写死一样的,这个问题困扰了很长时间,试过**@BuilderParam**(类似于vue的插槽)传组件方式的,但是**@BuilderParam只能传一个,我想要传递的是一个数组,找了很多Api最后找到了WrappedBuilder[]**这种方......
  • [CSS] max-content, min-content, fit-content
    max-contenthttps://developer.mozilla.org/en-US/docs/Web/CSS/max-contentThe max-content sizingkeywordrepresentsthemaximum intrinsicsize ofthecontent.Fortextcontentthismeansthatthecontentwillnotwrapatallevenifitcausesoverflows.......