2009-11-05 37 views
4

我试图想出最合适的方式来通过HTTP代理进行双向套接字连接 - 可以说这是一种telnet样式的协议。不幸的是,我还需要支持NTLM身份验证(使用代理)以及基本和摘要,以及我无法预测的任何其他未来身份验证机制。通过HTTP代理进行双向通信

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

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

不必通过各种我能想到的,我想出了一些讨厌的代码,失控了的HttpWebRequest其相关的NetworkStream准备运行允许双向通信:

..... 
    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,这将允许我利用代理身份验证的内置运行时功能。

回答

2

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

如果当你说“双向”时,你会想到更像是一个简单的TCP套接字,客户端和服务器随意读写,然后抱歉,但这不是HTTP所做的。客户端发送请求并且服务器感知响应。就这样。从技术上讲,如果你没有一个客户端API阻碍,强制执行HTTP的预期约束,并且你可以制作自己的非标准服务器,那么你可以在一个HTTP中使用多个客户端< - >服务器交换请求,但在那时它不会再是HTTP了,它会是一个像握手这样的HTTP的TCP连接,而你的代理甚至可能不允许它。这就是说,听起来你根本不需要写响应流,要么你很困惑,而只需要做一个POST(请参阅GetRequestStream),或者你只是一个有点困惑,你可以发送一个新的请求后,你已经处理了回应。一旦您调用WebResponse中的.Close方法,您甚至可以重用相同的HttpWebRequest实例。所有这些都会发生在同一个TCP套接字上(如果你的服务器和代理支持的话)。

好的,我希望一切都有意义。如果它不以这种或那种方式回答你的问题,只是提供一些你想要完成的有关“双向”沟通的更多细节。我知道你有一定的限制,即通过一个HTTP代理,这个HTTP代理需要HTTP认证要求,这限制了很多事情。