在.net 4.5中使用ClientWebSocket时,如何设置User-Agent和Referer标头?

Pal*_*alo 5 c# user-agent websocket http-headers .net-4.5

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

System.ArgumentException occurred
  Message=The 'User-Agent' header must be modified using the appropriate property or method.
Parameter name: name
  ParamName=name
  StackTrace:
       at System.Net.WebHeaderCollection.ThrowOnRestrictedHeader(String headerName)

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

代码,不起作用:

ClientWebSocket socket = new ClientWebSocket();
// Will throw
socket.Options.SetRequestHeader("User-Agent", "SomeUserAgentString");
// Will throw
socket.Options.SetRequestHeader("Referer", "SomeReferer"]);
Run Code Online (Sandbox Code Playgroud)

Jos*_*hua 8

看起来你不能设置这些属性,至少现在不行.你也许可以通过反思来做到这一点.

如果你仔细观察堆栈跟踪,你会发现抛出方法是System.Net.WebHeaderCollection.ThrowOnRestrictedHeader.System.Net.WebHeaderCollection是一个专门的名称值集合,旨在处理HTTP标头.如果你看一下备注部分,你会看到以下内容:

某些常见标头被视为受限制,并且由API直接公开(例如Content-Type)或受系统保护且无法更改.

该列表将两个User-Agent和Referer属性列为受保护的标头,因为ClientWebSocket不公开它所以无法设置.

所有这一切是说,不过,如果你绝对需要设置的头,你需要找到私有引用WebHeaderCollection您的ClientWebSocketOptions(公开为Options你的财产ClientWebSocket),并调用受保护的AddWithoutValidate方法来设置标题.