【问题标题】:How can I set User-Agent and Referer headers when using ClientWebSocket in .net 4.5?在 .net 4.5 中使用 ClientWebSocket 时如何设置 User-Agent 和 Referer 标头?
【发布时间】:2013-03-31 11:08:32
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    我的答案中的更多详细信息: Cannot set some HTTP headers when using System.Net.WebRequest

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

        【讨论】:

          【解决方案4】:

          很简单:

          referrer header 应该这样写:

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

          【讨论】:

          • WebSockets 不使用 HttpWebRequest。
          【解决方案5】:

          您似乎无法设置这些属性,至少现在不行。你也许可以通过反射来做到这一点。

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

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

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

          话虽如此,但如果您绝对需要设置这些标头,则需要找到您的ClientWebSocketOptions 的私人参考WebHeaderCollection(公开为Options ClientWebSocket) 上的属性并调用受保护的 AddWithoutValidate 方法来设置标题。

          【讨论】:

            猜你喜欢
            • 2014-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多