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