【问题标题】:HttpClient / HttpRequestMessage accept header parameters cannot have spacesHttpClient / HttpRequestMessage 接受头参数不能有空格
【发布时间】:2017-07-19 15:09:08
【问题描述】:

我正在处理一个 API,它要求我设置标头 application/json;masked=false 以取消屏蔽某些信息。使用

设置标题时
var request = new HttpRequestMessage()
request.Headers.Add("Accept", "application/json;masked=false");

看起来好像在;masked 之间添加了一个空格,使输出标头application/json; masked=false。不幸的是,我正在使用的这个 API 似乎只检查文字 application/json;masked=false 而没有空格。我知道标题有效,因为如果我在邮递员中没有空格的情况下使用它,它就可以正常工作。如果我使用在邮递员中生成的一个 C#,它不会。

有没有办法覆盖这种行为?

谢谢

【问题讨论】:

  • 查看referencesource.microsoft.com/#System/net/System/Net/… 的 WebRequest 源。至于修复,它看起来不太好,因为所有标头都经过了一些“整理”,可能是因为它在某个 RFC 中。如果你能找出你所使用的 API 在 RFC 中的错误之处,那么告诉他们他们有一个不符合标准的实现可能会更容易,他们应该修复它。
  • 仅供参考,这在 Framework 4.5 中是相同的。不确定最终是否可以轻松修复(当您阅读 w3c.org 上的页面时,您知道情况很糟糕)。
  • @Neil 感谢您提供源链接!老实说,我忘记了这一点。在这一点上,我认为您可能是对的,我们需要联系他们并告诉他们他们的 API 不合格。
  • @DaveBecker 是的,非常棒,哈哈。感谢您在 Framework 中对其进行测试!

标签: c# .net-core dotnet-httpclient


【解决方案1】:

好的,所以通过一些挖掘,我们最终找到了这个问题的 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();
            }
        }

【讨论】:

  • 感谢您发布所有这些内容。我有一张票,我假设是你遇到这个空间问题的同一家公司,因为它没有屏蔽敏感数据。希望他们尽快符合标准。非常感谢您发布解决方法。很高兴我不是唯一一个面临同样问题的人。
  • @MattH 没问题,如果这是一家处理薪酬的公司,我们可能是 :) 我们实际上已经给他们发了电子邮件,他们通知了我们这个未解决的问题,然后说他们不能支持它:/ 但是,问题在于 .netcore“未来”里程碑,所以希望它们要么符合要求,要么 MS 让我们强制使用我们输入的内容。
【解决方案2】:

这个问题在 .NET 5 中仍然存在,但我通过使用解决了它:

request.Headers.TryAddWithoutValidation("Accept", "application/json;masked=false");

使用此方法时无需反射。

【讨论】:

    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多