更新时间:2022-05-05 22:55:09
您已经知道,您需要做一些非标准的事情,所以我提出了一个非标准的解决方案来完成这项工作.
As you're aware, you're needing to do something non-standard, so I present a non-standard solution to get this done.
您可能尝试了client.DefaultRequestHeaders.Add()
和client.DefaultRequestHeaders.TryAddWithoutValidation()
均未成功.您可以使用反射来破坏进入HttpRequestHeaders
的方式来修改验证行为.
You've likely tried client.DefaultRequestHeaders.Add()
and client.DefaultRequestHeaders.TryAddWithoutValidation()
without success. You can use reflection to evil your way into HttpRequestHeaders
to modify the validation behavior.
static void AllowInvalidRequestHeader(string header)
{
var headerType = typeof(HttpRequestHeaders);
var field = headerType
.GetField("invalidHeaders", System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Static) ??
headerType
.GetField("s_invalidHeaders", System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Static);
if (field == null) return;
var invalidFields = (HashSet<string>)field.GetValue(null);
invalidFields.Remove(header);
}
在应用程序初始化中,调用AllowInvalidRequestHeader("Content-Type")
一次,并使用以下方法初始化HttpClient
实例:
In application initialization, call AllowInvalidRequestHeader("Content-Type")
once, and initialize HttpClient
instances with this:
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Content-Type", "application/json");
在一个简单的服务器端页面中,回显具有请求标头,我回来了:
In a simple server side page that echos have request headers, I get back:
<div class="row">
<p>Connection: Keep-Alive</p>
<p>Content-Type: application/json</p>
<p>Host: localhost:52975</p>
<p>MS-ASPNETCORE-TOKEN: de3a3a58-eccc-407b-b5f7-9a6663631587</p>
<p>X-Original-Proto: http</p>
<p>X-Original-For: 127.0.0.1:53362</p>
</div>