【问题标题】:Two way communication through a HTTP proxy通过 HTTP 代理进行双向通信
【发布时间】:2009-11-05 12:17:05
【问题描述】:

我正在尝试提出最合适的方法来通过 HTTP 代理建立双向套接字连接 - 可以说它是一种 telnet 风格的协议。不幸的是,除了我无法预测的任何其他未来身份验证机制之外,我还需要支持 NTLM 身份验证(使用代理)以及 Basic 和 Digest。

如果它只是基本的和消化的,我会自己处理连接,但我真的不想陷入 NTLM 的泥潭。查看底层 AuthenticationManager API,它看起来与 HttpWebRequest 非常相关,因此如果我使用套接字/tcpclient/whatever 甚至编写新的 WebRequest 派生,我将无法利用该功能。

使用 HttpWebResponse 会产生一个无法写入的流,在检索到响应流后使用 RequestStream 会产生并发 io 异常。

在尝试了所有我能想到的可能性之后,我想出了一些讨厌的代码,这些代码可以将 NetworkStream 与允许双向通信的 HttpWebRequest 关联:

  .....
  HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
  Stream str = resp.GetResponseStream();

  System.Type type = str.GetType();
  PropertyInfo info = type.GetProperty("Connection", BindingFlags.NonPublic|BindingFlags.Instance| BindingFlags.Public);
  object obj = info.GetValue(str, null);
  type = obj.GetType();
  info = type.GetProperty("NetworkStream", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
  object obj2 = info.GetValue(obj, null);
  NetworkStream networkStream = obj2 as NetworkStream;

这让我很反感(一开始它不适用于 Mono),所以我想知道是否有更好的方法使用公共 API,这将允许我利用代理身份验证的内置运行时功能.

【问题讨论】:

    标签: c# http proxy


    【解决方案1】:

    HTTP 有两种方式。客户端可以使用 HTTP GET 发送无数据请求(尽管即使这样数据也可以放在 URL 或标头中),或者他们可以使用 HTTP POST 发送数据,服务器可以发送带有标头和数据的响应。

    如果当您说“双向”时,您的想法更像是一个简单的 TCP 套接字,客户端和服务器可以随意读写,那么抱歉,但这不是 HTTP 所做的。客户端发送请求,服务器感知响应。就这样。从技术上讲,如果您没有客户端 API 阻碍,强制执行 HTTP 的预期约束,并且您可以制作自己的非标准服务器,那么您可以在单个 HTTP 中进行多个客户端服务器交换请求,但到那时,它就不再是 HTTP,而是一个 TCP 连接,带有类似 HTTP 的握手,而您的代理甚至可能不允许它。

    也就是说,听起来你根本不需要写入响应流,要么你很困惑,你只需要做一个 POST(见 GetRequestStream),要么你只是一点点感到困惑,您可以在处理完响应后发送一个新请求。在您获得的 WebResponse 上调用 .Close 方法后,您甚至可以重用相同的 HttpWebRequest 实例。所有这些都将发生在同一个 TCP 套接字上(如果您的服务器和代理支持它)。

    好的,我希望这一切都有意义。如果它没有以一种或另一种方式回答您的问题,请提供更多关于您在“双向”通信方面尝试完成的内容的详细信息。我知道您有通过带有 HTTP 身份验证要求的 HTTP 代理的限制,这限制了很多事情。

    【讨论】:

      猜你喜欢
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 2017-07-23
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      相关资源
      最近更新 更多