使用套接字时的 AllowAutoRedirect 功能

Posted

技术标签:

【中文标题】使用套接字时的 AllowAutoRedirect 功能【英文标题】:AllowAutoRedirect Functionality when using sockets 【发布时间】:2021-12-18 02:01:39 【问题描述】:

我知道 HttpWebRequest 有一个参数可用于将 URL 重定向设置为 false (request.AllowAutoRedirect = False;)。

直接使用Socket连接是怎么做到的?

我没有任何代码可显示,因为我刚刚开始开发项目。

不幸的是,我需要坚持使用 Socket 连接,不能使用 HttpWebRequest、WebClient 或 HTTPClient。 :(

【问题讨论】:

为什么不能使用它们?您没有连接到 HTTP 服务吗?如果没有,您使用的是什么协议? 我正在构建一个视频流应用程序,而其他选项对于连接来说太慢了。使用套接字时,应用程序运行良好,任何其他类型都有延迟。使用套接字时是否有设置此参数的参数? HTTPWebRequest是使用sockets的,所以一定是可以的,有谁知道代码长什么样子或者用什么参数? 重定向是一个应用程序协议(例如 HTTP)问题。您使用套接字直接访问传输协议 (TCP),并在其上编写应用程序协议。如果您收到一个说要去其他地方的响应,您关闭套接字,打开另一个主机的新套接字,然后在那里重试。 HTTP 重定向可以指向同一主机上的资源,因此这些客户端可能会保持套接字打开。 感谢 madreflection 的详细信息!奇怪的是,我刚刚做了一些测试,当我通过 HTTPWebRequest(AllowAutoRedirect 设置为 false)发送一个特定的 URL 时,我得到一个 302 响应,并且重定向的 URL 显示在位置标题下。当我在套接字连接上做同样的事情时,我得到一个超时,我得到一个 408 超时响应。你可能已经确定了,重定向到另一个主机。明白了,我需要为这个新主机创建另一个套接字!完美,谢谢各位!! :) 408 是“请求超时”,这意味着您还没有发送完整的请求,服务器已经厌倦了等待。您根本没有获得重定向。您应该返回使用其他类型之一。它们本质上并不慢。我假设您没有正确使用它们来进行有效的沟通。使用提供的 Web 客户端类型之一显示一些代码,并获得帮助以确定您需要在那里修复什么。 【参考方案1】:

没有套接字重定向这样的东西。

HTTP 重定向是指您连接到指定的服务器,发送您的 HTTP 请求,然后服务器发送一个 HTTP 响应,告诉您转至不同的 URL。那你就去那个网址吧。

看起来像这样:

*** socket opened to example.com

*** client sends this part:
GET /some/address HTTP/1.1
Host: example.com

*** server sends this part:
HTTP/1.1 302 Found
Location: https://other.example.com/some_place?really=yes

*** socket closed to example.com

如果您禁用了自动重定向,这就是您的程序得到的响应。否则,HTTP 库会继续运行:

*** socket opened to other.example.com

*** client sends this part:
GET /some_place?really=yes HTTP/1.1
Host: other.example.com

*** server sends this part:
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 11

hello world

*** socket closed to other.example.com

如果您只是使用套接字,您将自己开始这样做。

【讨论】:

有道理,谢谢!

以上是关于使用套接字时的 AllowAutoRedirect 功能的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 HttpClientHandler 中设置 allowautoredirect=false

即使 AllowAutoRedirect = true HttpClient 也不会重定向

使用 gen_tcp 时的套接字接受率

在 C 中使用套接字时的字符串比较

套接字中没有可用数据时的异步编程模型

包含互斥锁 C++ 时的套接字问题