我正在尝试通过HTTP代理提出最合适的双向套接字连接方式 - 让我们说它是一种telnet风格的协议。不幸的是,我还需要支持NTLM身份验证(使用代理)以及Basic和Digest,以及我无法预测的任何其他未来身份验证机制。
如果它只是基本和消化我自己处理连接,但我真的不想陷入NTLM的泥潭。查看底层的AuthenticationManager API,它看起来与HttpWebRequest非常相关,所以如果我使用socket / tcpclient / whatever甚至编写新的WebRequest派生,我就无法利用该功能。
在检索到响应流后,使用RequestStream处理HttpWebResponse会产生无法写入的流,从而产生并发的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,这将允许我利用代理身份验证的内置运行时功能
答案 0 :(得分:2)
HTTP是双向的。客户端可以使用HTTP GET发送无数据请求(尽管数据可以放入URL或标头中),或者他们可以使用HTTP POST发送数据,服务器可以发送包含标头和数据的响应。
如果当你说“双向”时,你会想到更像是一个简单的TCP套接字,其中客户端和服务器随意读写,那么很抱歉,但这不是HTTP所做的。客户端发送请求,服务器检测到响应。就这样。从技术上讲,如果您没有阻碍客户端API,强制执行HTTP的预期约束,并且您可以自己编写非标准服务器,则可以在单个服务器中进行多个客户端< - >服务器交换HTTP请求,但此时它不再是HTTP,它是一个像握手一样的HTTP连接,你的代理可能甚至不允许它。
那就是说,听起来你真的不需要写入响应流,要么你很困惑而且你只需要做一个POST(参见GetRequestStream),或者你只是一点点困惑,您可以在处理完回复后发送新请求。一旦在WebResponse上调用.Close方法,您甚至可以重用相同的HttpWebRequest实例。所有这些都将发生在同一个TCP套接字上(如果您的服务器和代理支持它)。
好的,我希望一切都有意义。如果它没有以某种方式回答你的问题,只需提供一些关于你在“双向”沟通方面要做的事情的更多细节。我知道您有一个约束,即通过HTTP代理和HTTP身份验证要求,这限制了很多事情。