C# 重定向httprequest的最准确方法

C# 重定向httprequest的最准确方法,c#,redirect,httprequest,httplistener,C#,Redirect,Httprequest,Httplistener,我正在研究一种将http请求从我的浏览器重定向到另一台电脑的解决方案。 简而言之:有没有更准确的方法将传入的HttpListenerRequest作为HttpRequest发送给客户端 背景:浏览器将http请求发送到127.0.0.1:9666(是的,单击“n”加载),应该由下载程序响应。 在我的例子中,下载程序没有在运行浏览器的机器上运行。 像这样的端口转发工具对我不起作用: 所以我决定用C#编写一个特定的点击加载重定向程序。 我的问题是重定向浏览器的请求。ATM,我听127.0.0.1:9

我正在研究一种将http请求从我的浏览器重定向到另一台电脑的解决方案。 简而言之:有没有更准确的方法将传入的HttpListenerRequest作为HttpRequest发送给客户端

背景:浏览器将http请求发送到127.0.0.1:9666(是的,单击“n”加载),应该由下载程序响应。 在我的例子中,下载程序没有在运行浏览器的机器上运行。 像这样的端口转发工具对我不起作用: 所以我决定用C#编写一个特定的点击加载重定向程序。 我的问题是重定向浏览器的请求。ATM,我听127.0.0.1:9666,发送一些信息给客户机,客户机将这些信息重定向到下载程序,下载程序进行应答。(长期-短期:这将重定向到浏览器)。 但是使用预定义的案例只重定向核心信息对我来说似乎不太合适。应该可以重定向整个请求。所以我不需要区分不同的情况,这应该更准确。 除了复制所有头和属性之外,还有其他方法重定向此请求吗

服务器使用HttpListener来侦听浏览器的请求。 然后,服务器向客户端发送一个HttpReqest。 客户端使用HttpListener来侦听服务器的请求。 客户端向下载程序发送HttpRequest, 使用GetResponse,并将其作为响应发送给服务器,服务器响应浏览器。 我在MSDN中查找了一些函数,但没有找到“复制整个请求”的好方法

这是我的问题代码:

Thread.Sleep(1500);
//Read client's/JDownloader's stream, send to browser/redirector
do
{
    Read = Outstream.Read(Buffer, 0, Buffer.Length);
    Totalr += Read;
    Instream.Write(Buffer, 0, Read);
    Sent += Read;
    // Bufferstr += ASCIIEncoding.ASCII.GetString(Buffer, 0, Read); debugging
} while (Read != 0);
如果没有Thread.Sleep,第一次读取返回读取的171字节(正好是HTTP头,缓冲区长度是1024字节)。 第二次迭代:当执行Outstream.Read时,什么也不会发生。不管我等多久。看起来,读卡器正在等待流量接收,但是没有流量接收(奇怪…)当线程休眠500-1500ms时,第一次读取返回351bytes被读取(完整的http请求),然后再次,第二次迭代,什么都没有。 从浏览器或JDownloader的网络流读取时会发生这种情况。他们永远不会返回0。一个脏方法是用Read==Buffer.Length,dirty替换while参数,因为当接收到Buffer.Length字节时,它将失败(再次无限等待,耶)。 DataAvailable属性似乎并不总是正确的,有时它被设置为false,当程序甚至没有从流中读取某些内容,但有字节要接收时。(也很奇怪…) 对于正确的接收环路,还有其他想法吗


没有人?我的问题的简短总结:浏览器的请求流和JDownloaders响应流都不返回0。当尝试另一次读取时,程序只是等待更多字节的接收。 所以我不知道一个故障保护方法来读取整个流。 当streamlength%bufferlength==0时,只要重复直到读取的字节数小于缓冲区的长度,就会导致前面提到的无休止的字节等待

而且,与我的程序尝试读取流相比,JDownloader似乎需要更多的时间来生成答案并将其写入流中。因此,我将只收到一部分流。另一次读取尝试将导致,万岁,无休止地等待字节。
有没有其他方法可以在没有静态延迟的情况下(通过线程睡眠)接收整个流?

您可以打开一个TcpListener并转发原始字节吗?这样,您根本不需要关心HTTP。

您要求的基本上是一个代理实现-构建一个工作良好的代理不是一项简单的任务,因为您必须从两个方向理解和处理HTTP等

我建议使用现有库或一些可配置的代理:

  • (附资料来源)
  • (附资料来源)
谢谢,我没有想到使用套接字(或相关的东西),我曾经浪费了2天时间用套接字编程,基于HttpRequest的代码以这种方式做得更好,编码耗时4小时。(那是我开始用c语言编程的时候)。只需通过TCP重定向字节就可以完美地工作。唯一的问题是回答请求的下载程序。。。太慢了。当我从流中读取(请求的答案)时,只有头,内容缺失。有没有比线程睡眠(1000)更好的方法?如果需要的话,我可以在以后发布源代码,你永远不需要睡觉。您应该调用read,直到它返回0。然后,插座关闭。读取将被阻止,直到字节变为可用或套接字关闭。好的,我现在用“手动”的方式完成了它-不是很精确,但它工作得很好:只在发送头以外的任何内容时,才读取整个流。当有POST数据时,还有一个内容长度头。所以我只是从流中读取,直到tcp缓冲区为空,然后检查内容长度是否给定。如果是,则过滤掉内容长度,并重复读取,直到内容长度+标头长度等于或小于接收字节的总量。瞧。