HttpClient中的非标准请求头
我们有一个遗留的EDI HTTP POST上传到某个第三方供应商,这个上传需要按如下格式设置请求头:
--BOUNDARY
Content-type: application/x-ups-binary
Content-length:
.NET 10.0 HttpClient 会用 Content-Type 和 Content-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-Type 和 Content-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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。