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

时间:2013-04-09 06:33:32

标签: c# http-headers websocket .net-4.5 user-agent

使用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"]);

4 个答案:

答案 0 :(得分:8)

看起来你不能设置这些属性,至少现在不行。您可能能够通过反思来实现。

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

  

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

该列表将User-AgentReferer属性列为受保护的标头,但由于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/