5

使用的明显答案ClientWebSocket.SetHeader会引发异常,因为它是受保护的标头:

System.ArgumentException 发生
  Message=必须使用适当的属性或方法修改“User-Agent”标头。
参数名称:名称
  参数名称=名称
  堆栈跟踪:
       在 System.Net.WebHeaderCollection.ThrowOnRestrictedHeader(字符串 headerName)

异常字符串建议在其自身上使用属性/方法,ClientWebSocket但我找不到任何此类属性/方法。似乎此异常是为HttpWebRequest实际上具有此类属性的类设计的。

该代码不起作用:

ClientWebSocket socket = new ClientWebSocket();
// Will throw
socket.Options.SetRequestHeader("User-Agent", "SomeUserAgentString");
// Will throw
socket.Options.SetRequestHeader("Referer", "SomeReferer"]);
4

5 回答 5

8

看起来您不能设置这些属性,至少现在不能。您也许可以通过反射来做到这一点。

如果您仔细查看堆栈跟踪,您会发现 throwing 方法是System.Net.WebHeaderCollection.ThrowOnRestrictedHeader. System.Net.WebHeaderCollection是一个专门用于处理 HTTP 标头的名称值集合。如果您查看备注部分,您将看到以下内容:

一些常见的标头被认为是受限制的,它们要么由 API 直接公开(例如Content-Type),要么受系统保护且无法更改。

该列表同时具有列为受保护标头的User-AgentReferer属性,并且无法设置,因为ClientWebSocket没有公开它。

尽管如此,如果您绝对需要设置这些标头,则需要找到您的私有引用(作为WebHeaderCollection您的属性ClientWebSocketOptions公开)并调用受保护的方法来设置标头。OptionsClientWebSocketAddWithoutValidate

于 2013-04-12T16:28:25.053 回答
1

看起来这是 .NET Framework 中的一个错误:

https://github.com/dotnet/corefx/issues/26627#issuecomment-391472613

不幸的是,似乎即使 Joshua 建议的反射黑客也不起作用,因为在建立 websocket 连接时,作为 HTTP 交换的一部分再次执行验证:

https://github.com/dotnet/corefx/issues/26627#issuecomment-361234413

于 2019-05-15T07:57:28.093 回答
0

您可以使用反射来更改带有 HeaderInfo 的静态 Hashtable(WebHeaderCollection 使用的所有内部类)。

我的答案中的更多详细信息: 使用 System.Net.WebRequest 时无法设置一些 HTTP 标头

编辑:已确认此修复了 ClientWebSocket 问题并允许您设置 User-Agent 和 Referer。

于 2019-10-28T04:57:17.640 回答
-2

我想我找到了一个“简单”的解决方案

如果您使用“.NET Core 2.2”(在 Windows 10 上)构建,则:

"socket.Options.SetRequestHeader("User-Agent", "SomeUserAgentString");"

不会扔。与所有其他受限标头相同。

所以要么它工作,要么它只是默默地失败。我无法测试和验证它是否有效,因为我不知道如何记录或查看请求标头。(有人知道吗?)

于 2018-09-11T09:24:53.967 回答
-5

非常简单:

推荐人标头应该这样写:

HttpWebRequest objRequest()... objRequest.Referer = " http://microsoft.com/simpleApp/

于 2013-05-12T06:48:53.757 回答