HttpClient / HttpRequestMessage accept header 参数不能有空格
HttpClient / HttpRequestMessage accept header parameters cannot have spaces
我正在处理一个 API,它需要我设置 header application/json;masked=false
才能显示一些信息。使用
设置 header 时
var request = new HttpRequestMessage()
request.Headers.Add("Accept", "application/json;masked=false");
看起来好像在 ;
和 masked
之间添加了一个 space,使得输出 header application/json; masked=false
。不幸的是,我正在使用的这个 API 似乎只检查没有 space 的文字 application/json;masked=false
。我知道 header 有效,因为如果我在邮递员中不使用 space 就可以正常工作。如果我使用在邮递员中生成的 C#,它不会。
有什么方法可以覆盖此行为吗?
谢谢
好吧,通过一些挖掘,我们最终找到了这个 github 问题的问题:https://github.com/dotnet/corefx/issues/18449 他们有一个使用反射的解决方法。
我采用了他们的解决方法来解决我正在做的事情:
request.Headers.Add("Accept", contentType);
foreach (var v in request.Headers.Accept)
{
if (v.MediaType.Contains("application/json"))
{
var field = v.GetType().GetTypeInfo().BaseType.GetField("_mediaType", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(v, "application/json;masked=false");
v.Parameters.Clear();
}
}
这个问题在 .NET 5 中仍然存在,但我通过使用解决了它:
request.Headers.TryAddWithoutValidation("Accept", "application/json;masked=false");
使用此方法时不需要反射。
我正在处理一个 API,它需要我设置 header application/json;masked=false
才能显示一些信息。使用
var request = new HttpRequestMessage()
request.Headers.Add("Accept", "application/json;masked=false");
看起来好像在 ;
和 masked
之间添加了一个 space,使得输出 header application/json; masked=false
。不幸的是,我正在使用的这个 API 似乎只检查没有 space 的文字 application/json;masked=false
。我知道 header 有效,因为如果我在邮递员中不使用 space 就可以正常工作。如果我使用在邮递员中生成的 C#,它不会。
有什么方法可以覆盖此行为吗?
谢谢
好吧,通过一些挖掘,我们最终找到了这个 github 问题的问题:https://github.com/dotnet/corefx/issues/18449 他们有一个使用反射的解决方法。
我采用了他们的解决方法来解决我正在做的事情:
request.Headers.Add("Accept", contentType);
foreach (var v in request.Headers.Accept)
{
if (v.MediaType.Contains("application/json"))
{
var field = v.GetType().GetTypeInfo().BaseType.GetField("_mediaType", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(v, "application/json;masked=false");
v.Parameters.Clear();
}
}
这个问题在 .NET 5 中仍然存在,但我通过使用解决了它:
request.Headers.TryAddWithoutValidation("Accept", "application/json;masked=false");
使用此方法时不需要反射。