使用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"]);
答案 0 :(得分:8)
看起来你不能设置这些属性,至少现在不行。您可能能够通过反思来实现。
如果仔细查看堆栈跟踪,您会发现投掷方法为System.Net.WebHeaderCollection.ThrowOnRestrictedHeader
。 System.Net.WebHeaderCollection
是专门用于处理HTTP标头的名称值集合。如果你看一下备注部分,你会看到以下内容:
某些常见标头被视为受限制,并且由API直接公开(例如 Content-Type )或受系统保护,无法更改。
该列表将User-Agent
和Referer
属性列为受保护的标头,但由于ClientWebSocket
未公开,因此无法设置。
尽管如此,如果您绝对需要来设置这些标头,您需要找到WebHeaderCollection
的私人参考ClientWebSocketOptions
(公开为Options
上的ClientWebSocket
属性,并调用受保护的AddWithoutValidate
方法来设置标题。
答案 1 :(得分:0)
看起来像是.NET Framework中的错误:
https://github.com/dotnet/corefx/issues/26627#issuecomment-391472613
不幸的是,似乎即使约书亚(Joshua)提出的反射黑客也无法使用,因为在建立websocket连接时,验证是作为HTTP交换的一部分再次执行的:
https://github.com/dotnet/corefx/issues/26627#issuecomment-361234413
答案 2 :(得分:0)
您可以使用反射来更改带有HeaderInfo(WebHeaderCollection使用的所有内部类)的静态Hashtable。
更多详细信息,请点击此处: Cannot set some HTTP headers when using System.Net.WebRequest
编辑:已经确认可以解决ClientWebSocket问题,并允许您设置User-Agent和Referer。
答案 3 :(得分:-4)
非常简单:
引用者标题应该这样写:
HttpWebRequest objRequest()... objRequest.Referer =“http://microsoft.com/simpleApp/