.net 如何实现自定义代理服务器?

.net 如何实现自定义代理服务器?,.net,proxy,filter,browser,response,.net,Proxy,Filter,Browser,Response,最终,我想有效地将其限制为显示HTML、图像、脚本等,但决不向用户显示“另存为”对话框 在对该问题的回答中提出的解决方案是连接一个定制代理服务器,该服务器检查响应并过滤掉任何可能导致下载提示的内容。如何在.NET应用程序中实现这样的代理?我不想安装第三方软件或库 我找到了,但有两个问题: 侦听器需要一组预定义的前缀来触发它。但是,我不希望在我的应用程序中硬编码主机名或端口号,而是将其保持为通用的 我必须自己实现执行实际请求的代码——难道没有什么东西可以帮我做到这一点吗?我可以简单地点击行,检查响

最终,我想有效地将其限制为显示HTML、图像、脚本等,但决不向用户显示“另存为”对话框

在对该问题的回答中提出的解决方案是连接一个定制代理服务器,该服务器检查响应并过滤掉任何可能导致下载提示的内容。如何在.NET应用程序中实现这样的代理?我不想安装第三方软件或库

我找到了,但有两个问题:

  • 侦听器需要一组预定义的前缀来触发它。但是,我不希望在我的应用程序中硬编码主机名或端口号,而是将其保持为通用的
  • 我必须自己实现执行实际请求的代码——难道没有什么东西可以帮我做到这一点吗?我可以简单地点击行,检查响应的内容并根据需要更改它们(就像J2EE中的请求过滤器在服务器端所做的那样)
  • 更新 好的,我想我需要澄清一下:我的.NET(富客户端)应用程序正在多个项目中使用,这些项目也有基于web的应用程序。NET应用程序包括一个可重用的通用表单和一个WebBrowser控件。其他开发人员使用该表单将对其web应用程序的访问集成到.NET应用程序中

    我想阻止下载,所以我想让我的WebBrowser表单拦截所有流量,并确保它不会导致“另存为”对话框。因此

    • 我不知道主持人的名字会是什么
    • WebBrowser指向真实的URL,用户单击常规链接,触发JavaScript。。。所有这些都是由web应用程序提供的
    • 如果WebBrowser指向localhost(如建议的那样),我必须解析响应并重写所有链接,以便它们再次指向localhost,保留原始URL。我不想经历那种麻烦

    HttpListener
    应该可以,但它只是围绕http.sys的包装,并且此库仅在Windows XP及更高版本上可用

    HttpPrefixes 您只需要一个前缀
    http://127.0.0.1:8080/
    ,因为它只用于本地网络控制。或者,支持通配符,如http://*:8080/,但没有理由在您的案例中使用它

    延斯·班曼写道:

    被访问的应用程序不在本地主机上,它们 可以在任何地方。这就是我不知道的原因 想要硬编码任何东西


    你所说的申请是什么意思?你是说网站?这完全是另外一回事,您的特殊代理服务器将在
    http://127.0.0.1:8080/
    ,因此您的网络控制必须使用代理服务器
    http://127.0.0.1:8080/
    。在这一点上,它仍然在本地机器中

    在HttpListenerRequest/Response和HttpWebRequest/Response之间转换 将每个传入的
    HttpListenerRequest
    转换为
    HttpWebRequest
    ,请求响应,您将得到
    HttpWebResponse
    对象,分析它是否允许您的WebBrowser控件响应,如果允许,则将其写入
    HttpListenerResponse
    对象,否则写入其他内容(错误状态)

    这可能是在.NET上构建自己的代理服务器的最简单方法

    延斯·班曼写道:

    对,这种转变是我 想避免不得不这样做。或者我可以吗 仅在几行代码中执行此操作?从…起 看看API,它看起来更 复杂

    这其实很简单,因为http协议很简单。它基本上有三个部分

    • 请求行(包含URL、http方法和http版本)
    • 标题(这实际上是使API看起来如此庞大和重要的原因,但实际上所有这些属性和方法都只是原始http头上的薄层。您需要做的就是以通用方式将所有头直接
      HttpListenerRequest
      复制到
      HttpWebRequest
      。这两个类都有通用原始访问的属性)
    • 消息正文(如果有内容,只需复制其内容)
    整个转换过程如下所示:

    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
    类,但它是完整的代理服务器解决方案,应该很容易根据您的需要进行修改。

    可能是开源代理


    1.被访问的应用程序不在
    localhost
    上,它们可以在任何地方。这就是为什么我不想硬编码任何东西。2.对,这种转换是我想避免做的事情。或者我可以只在几行代码中完成吗?从API来看,它看起来更复杂。“你说的应用程序是什么意思?你指的是网站?"是的,网站。当表单显示时,WebBrowser指向一个URL,比如说。然后用户使用应用程序并单击链接,例如。localhost如何在这里发挥作用?您的web浏览器从不直接联系这些网站,它总是将请求委托给在localhost上运行的特殊代理服务器。我认为您将首先,我要开始编写一些代码,以充分理解它们是如何组合在一起的。嗨,使用发布的转换代码,我总是会遇到一个例外:“不能直接修改‘主机’头。参数名称:name”不是所有头都可以通过头来设置。Add(),它们有自己的属性。