HttpListener
应该没问题,但它只是 http.sys 的包装,而且这个库仅在 Windows XP 和更高版本上可用。
Http前缀
您只需要一个前缀http://127.0.0.1:8080/
,因为它仅适用于您的本地 web 控件。或者,支持通配符,http://*:8080/
但没有理由在您的情况下使用它。
延斯班曼写道:
访问的应用程序不在localhost
,它们可以在任何地方。这就是为什么我不想硬编码任何东西。
你说的应用是什么意思?你是说网站吗?这完全是另一回事,您的特殊代理服务器将在 HttpListenerRequests 上侦听http://127.0.0.1:8080/
,因此您的 webcontrol 必须使用代理服务器http://127.0.0.1:8080/
。此时它仍然在本地机器中。
在 HttpListenerRequest/Response 和 HttpWebRequest/Response 之间转换
将每个传入转换HttpListenerRequest
为HttpWebRequest
,请求响应,您将获得HttpWebResponse
对象,分析它是否允许您的 WebBrowser 控件响应,如果是,则将其写入HttpListnererResponse
对象,否则写入其他内容(错误状态)。
这可能是在 .NET 上构建自己的代理服务器的最简单方法
延斯班曼写道:
对,这种转换是我想要避免做的事情。或者我可以只用几行代码来做到这一点吗?从 API 来看,它看起来更复杂。
这实际上很容易,因为 http 协议很简单。它基本上分为三个部分。
- 请求行(它包含 URL、http 方法和 http 版本)
- 标头(这实际上是使 API 看起来如此庞大和重要的原因,但实际上所有这些属性和方法都只是原始 http 标头之上的薄层。您需要做的就是以通用方式直接将所有标头
HttpListenerRequest
从 复制到中HttpWebRequest
。这两个类都有用于原始访问的通用Headers属性)
- 消息正文(如果有,只需复制其内容)
整个转换看起来像这样:
HttpListenerRequest listenerRequest;
WebRequest webRequest = WebRequest.Create(listenerRequest.Url);
webRequest.Method = listenerRequest.HttpMethod;
webRequest.Headers.Add(listenerRequest.Headers);
byte[] body = new byte[listenerRequest.InputStream.Length];
listenerRequest.InputStream.Read(body, 0, body.Length);
webRequest.GetRequestStream().Write(body, 0, body.Length);
WebResponse webResponse = webRequest.GetResponse();
如果您需要有关 http 协议的更多帮助,请参阅此维基百科文章。
您还可以查看此开源项目以了解另一种方法。它不依赖于HttpListener
类,但它是完整的代理服务器解决方案,应该很容易根据您的需要进行修改。