HTTPWebResponse原始响应,使用reflection

HTTPWebResponse暴露Headers的属性,是否有可能得到像使用套接字 ,头和内容组合使用reflection的 原始响应 ,我认为必须有一种方法。

我可以使用套接字,但需要做很多工作,如代理支持,https,进展事件等等…列表很长,我一直强烈build议使用HTTPWebRequest,只有问题是我需要原始标题与响应,我试图下载的网站发送一个很长很奇怪的cookie,这不是由HTTPWebRequest,WebClient处理。 WordPress的博客,不能够使用WebClientlogin任何WordPress博客,但与套接字手动cookie处理它的作品完美,可能是WebClient中的错误。

1)只需要原始的标题,这将做的伎俩。

2)也是文章链接

文章说HTTPWebRequest有一个问题, 只有一个线程正在下载,而其他人一直在等待 ,如果这是真的,然后套接字更好?

文章说: 这段代码运行良好,但是它有一个非常严重的问题,因为WebRequest类函数GetResponse将对所有其他进程的访问locking,所以WebRequest将检索到的响应告诉closures,就像在前面代码的最后一行一样。 所以我注意到,总是只有一个线程正在下载,而其他人正在等待GetResponse。 为了解决这个严重的问题,我使用Socket实现了我的两个类MyWebRequest和MyWebResponse。

有一种方法来获得原始标题:

var rawHeaders = request.GetResponse().Headers.ToString(); 

与您的网站和要求你提供它返回:

 Pragma: no-cache X-Frame-Options: SAMEORIGIN Cache-Control: no-cache, must-revalidate, max-age=0 Date: Wed, 03 Aug 2011 12:08:49 GMT Expires: Wed, 11 Jan 1984 05:00:00 GMT Set-Cookie: wordpress_test_cookie=WP+Cookie+check; path=/,wordpress_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/wp-admin,wordpress_sec_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/wp-admin,wordpress_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/wp-content/plugins,wordpress_sec_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/wp-content/plugins,wordpress_logged_in_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpress_logged_in_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpress_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpress_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpress_sec_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpress_sec_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpressuser_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpresspass_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpressuser_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/,wordpresspass_c2d1208bd3bc2294298da94d67693495=+; expires=Tue, 03-Aug-2010 12:08:49 GMT; path=/ server: Apache X-Powered-By: PHP/5.2.17 Last-Modified: Wed, 03 Aug 2011 12:08:49 GMT Content-Type: text/html; charset=UTF-8 X-Cache: MISS from localhost X-Cache-Lookup: MISS from localhost:3128 Via: 1.0 localhost (squid/3.1.6) Connection: close 

这是否解决您的问题?

关于套接字而不是WebRequests – 我会建议反对这种方法。 这是重新发明轮子。

UPDATE

这并不能解决问题,因为上面的头文件已经以有损的方式被解析了(详见注释)。 经过仔细观察,我得出结论,在HttpWebRequest.GetResponse()之后,原始头字节已经丢失。

核心解析是在System.Net.WebHeaderCollection.ParseHeaders()System.Net.WebHeaderCollection.ParseHeadersStrict() (取决于System.Net.Configuration.SettingsSectionInternal.Section.UseUnsafeHeaderParsing的值)中完成的,两种方法都无法记录要求(提供)的信息。 不久之后,它们在其上运行的缓冲区( System.Net.Connection.m_ReadBuffer )被填充了来自线路的新数据。 原始标题丢失。

为了保存原始数据,你需要重新实现System.Net.Connection类,这个类是内部的,被ServicePoint强制引用,它是公开的,但仍然被HttpWebRequest强引用。 总之,你将不得不重新实现整个堆栈。

所以,除非你可以改变网站的行为或没有这些cookies,否则你将需要使用一个Socket。 如果是这样的话,我想表示哀悼。