HttpClient中的非标准请求头

前端开发 2026-07-09

我们有一个遗留的EDI HTTP POST上传到某个第三方供应商,这个上传需要按如下格式设置请求头:

--BOUNDARY

Content-type: application/x-ups-binary

Content-length:

.NET 10.0 HttpClient 会用 Content-TypeContent-Length 生成头信息(Type 为大写、Length),但在.NET Framework中,我们可以通过像下面这样的代码来绕过这个问题:

var content = new StringContent(data.Content + "\r\n");
content.Headers.Remove("Content-Type");
content.Headers.TryAddWithoutValidation("Content-type", "application/x-ups-binary");
content.Headers.Remove("Content-Length");
content.Headers.TryAddWithoutValidation("Content-length", data.Content.Length.ToString());
form.Add(content);

然而在.NET 10中,那段代码会执行,但头信息会被修正为 Content-TypeContent-Length

请问是否有在.NET 10上可行的替代方法?

解决方案

不,至少在不使用反射或重建 HttpClient 的情况下不可行。

即使使用 TryAddWithoutValidation,头信息也会被设置,使用的是内部方法,最终会达到 HeaderDescriptor,以及 KnownHeaders 它执行一个 OrdinalIgnoreCase 的查找。

前述的反射实现大致如下,请注意,这显然可能在未通知的情况下发生破坏性变更。

private static readonly object _headerDescriptor = Activator.CreateInstance(
    typeof(HttpHeaders).Assembly.GetType("System.Net.Http.Headers.HeaderDescriptor"),
    BindingFlags.Instance | BindingFlags.NonPublic,
    null,
    ["Content-type", false],
    null);

private static readonly MethodInfo _tryAddWithoutValidation = typeof(HttpHeaders)
    .GetMethod(
        "TryAddWithoutValidation",
        BindingFlags.Instance | BindingFlags.NonPublic,
        [ _headerDescriptor.GetType(), typeof(string) ])
    ?? throw new Exception("Can't find TryAddWithoutValidation method");

public static void AddContenttype(this HttpHeaders headers, string value)
{
    _tryAddWithoutValidation.Invoke(headers, [ _headerDescriptor, value ]);
}

请注意,对HTTP头字段进行大小写敏感处理违反了RFC 2616规范,应予以修正:

4.2
...
字段名不区分大小写。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章