【问题标题】:Make httpheader Connection: Keep-Alive into lower-case "keep-alive"使 httpheader Connection: Keep-Alive 变成小写的“keep-alive”
【发布时间】:2015-01-31 10:46:59
【问题描述】:

我尝试添加新标题的方法:

request.Headers.GetType().InvokeMember("ChangeInternal",
    BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
    Type.DefaultBinder, request.Headers, new object[] { "Connection", "keep-alive" }
);

实际上,它将keep-alive 标头添加到 Connection 中,但它不会替换旧的标头。所以我得到Connection: Keep-Alive,keep-alive

我尝试使用反射进行试验,但没有任何效果。

还有其他类似的问题,但没有解决方案。

【问题讨论】:

  • 你为什么通过反射而不是直接在 request 对象上调用它?
  • 为什么需要这样做?根据 HTTP 规范,标头不应区分大小写。
  • 达林,在使用普通浏览器时它会发送小写的keep-alive,而在使用webrequests时它会发送大写的keep-alive。在检查网站日志时,它可以很容易地看到这一点。所以我希望标题与我的例如 firefox 浏览器完全一样。
  • 我使用了以下解决方案...stackoverflow.com/questions/9650236/…

标签: c# httprequest


【解决方案1】:

只需执行以下操作:

request.Headers.Remove("Connection");
request.Headers.Add("Connection", "keep-alive");

不必通过反射设置这些标头。 首先,删除旧条目很重要,因为如果键已经存在,则调用 Add 会添加另一个值(您看到的结果是用逗号分隔的值)。

最好使用 HttpRequestHeader 枚举而不是标头名称作为字符串:

request.Headers.Remove(HttpRequestHeader.Connection);
request.Headers.Add(HttpRequestHeader.Connection, "keep-alive");

编辑:

我的错。请求对象上有一个明确的Connection 属性,在这种情况下必须使用它:

request.Connection = "keep-alive";

仅供参考:还有一些标头必须通过其显式属性进行设置。有关列表,请参阅此页面,remarks 部分:https://msdn.microsoft.com/en-us/library/System.Net.HttpWebRequest%28v=vs.110%29.aspx

编辑2:

好吧,看看the connection property's source code,你可以看到它限制了这些值的设置:

bool fKeepAlive = text.IndexOf("keep-alive") != -1;
bool fClose = text.IndexOf("close") != -1;
if (fKeepAlive || fClose)
{
    throw new ArgumentException(SR.GetString("net_connarg"), "value");
}

所以你有两个选择:

  1. 坚持使用大写值(我更喜欢),因为无论如何你没有真正的理由让它成为小写(“所以我希望标题完全一样我的例如 firefox 浏览器。”)。正如 Darin Dimitrov 已经说过的,标题不应该区分大小写。
  2. 以这种方式扩展您的反射方法,即首先删除标题,然后将其重新设置为小写。

【讨论】:

  • 这看起来像是将大写字母更改为小写字母的好方法,但我得到了异常: System.ArgumentException 未被用户代码处理 HResult=-2147024809 消息=必须使用“连接”标头修改适当的属性或方法。参数名称:名称 Source=System ParamName=name StackTrace:在 System.Net.WebHeaderCollection.ThrowOnRestrictedHeader(String headerName) at System.Net.WebHeaderCollection.Remove(String name) at System.Net.WebHeaderCollection.Remove(HttpRequestHeader header)跨度>
  • 我不明白。得到错误。 Message=Keep-Alive 和 Close 不能使用此属性设置。感谢您的回复
  • 感谢您的帮助和建议。我可能会尝试更多尝试,因为我现在有一些了解,如果它不起作用,我会保持上层价值。
  • 您需要这样做是有真实的原因。一些主机最近拒绝了keep-alive 不是全部小写的请求,因为 403 Forbidden。一个是相当大的主机。是的,他们违反了规范。这并没有改变这样一个事实,即需要这样做的真正理由。
猜你喜欢
  • 2021-07-20
  • 2016-09-07
  • 1970-01-01
  • 2023-03-07
  • 2012-08-12
  • 1970-01-01
  • 2013-03-25
  • 2014-01-22
  • 1970-01-01
相关资源
最近更新 更多