C# 重定向httprequest的最准确方法
我正在研究一种将http请求从我的浏览器重定向到另一台电脑的解决方案。 简而言之:有没有更准确的方法将传入的HttpListenerRequest作为HttpRequest发送给客户端 背景:浏览器将http请求发送到127.0.0.1:9666(是的,单击“n”加载),应该由下载程序响应。 在我的例子中,下载程序没有在运行浏览器的机器上运行。 像这样的端口转发工具对我不起作用: 所以我决定用C#编写一个特定的点击加载重定向程序。 我的问题是重定向浏览器的请求。ATM,我听127.0.0.1:9666,发送一些信息给客户机,客户机将这些信息重定向到下载程序,下载程序进行应答。(长期-短期:这将重定向到浏览器)。 但是使用预定义的案例只重定向核心信息对我来说似乎不太合适。应该可以重定向整个请求。所以我不需要区分不同的情况,这应该更准确。 除了复制所有头和属性之外,还有其他方法重定向此请求吗 服务器使用HttpListener来侦听浏览器的请求。 然后,服务器向客户端发送一个HttpReqest。 客户端使用HttpListener来侦听服务器的请求。 客户端向下载程序发送HttpRequest, 使用GetResponse,并将其作为响应发送给服务器,服务器响应浏览器。 我在MSDN中查找了一些函数,但没有找到“复制整个请求”的好方法 这是我的问题代码: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
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等 我建议使用现有库或一些可配置的代理:
- (附资料来源)
- (附资料来源)