【发布时间】: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,这将允许我利用代理身份验证的内置运行时功能.
【问题讨论】: