C# 通过HTTP代理进行双向通信

C# 通过HTTP代理进行双向通信,c#,http,proxy,C#,Http,Proxy,我正试图找到通过HTTP代理建立双向套接字连接的最合适的方法——假设它是telnet风格的协议。不幸的是,我还需要支持NTLM身份验证(使用代理)以及Basic和Digest,以及我无法预测的任何其他未来身份验证机制 如果只是基本的,我会自己处理连接,但我真的不想陷入NTLM的泥潭。看看底层的AuthenticationManager API,它看起来与HttpWebRequest非常关联,因此如果我使用socket/tcpclient/任何东西,甚至编写新的WebRequest派生,我就无法利

我正试图找到通过HTTP代理建立双向套接字连接的最合适的方法——假设它是telnet风格的协议。不幸的是,我还需要支持NTLM身份验证(使用代理)以及Basic和Digest,以及我无法预测的任何其他未来身份验证机制

如果只是基本的,我会自己处理连接,但我真的不想陷入NTLM的泥潭。看看底层的AuthenticationManager API,它看起来与HttpWebRequest非常关联,因此如果我使用socket/tcpclient/任何东西,甚至编写新的WebRequest派生,我就无法利用该功能

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

经过我所能想到的所有可能性,我想出了一些讨厌的代码,这些代码与允许双向通信的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,使我能够利用代理身份验证的内置运行时功能。

HTTP是双向的。客户机可以使用HTTP GET发送无数据请求(尽管即使这样,数据也可以放在URL或标头中),也可以使用HTTP POST发送数据,服务器可以发送带有标头和数据的响应

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

这就是说,听起来您根本不需要写入响应流,或者您非常困惑,只需要执行一个POST(请参阅GetRequestStream),或者您只是有点困惑,可以在处理响应后发送一个新的请求。在对得到的WebResponse调用.Close方法后,甚至可以重用相同的HttpWebRequest实例。所有这些都将发生在同一个TCP套接字上(如果您的服务器和代理支持的话)

好吧,我希望这一切都有意义。如果它没有以这种或那种方式回答你的问题,只需提供一点关于你在“双向”沟通方面努力实现的细节。我知道您必须通过HTTP代理和HTTP身份验证要求,这会限制很多事情