【问题标题】:HTTPWebResponse Raw Response, using ReflectionHTTPWebResponse 原始响应,使用反射
【发布时间】:2011-10-16 18:43:32
【问题描述】:

HTTPWebResponse 暴露了 Headers 的属性,是否有可能获得 原始响应,就像我们使用 socket 时一样,使用 Reflection 结合 Header 和 Content,我认为必须有一种方式。

我可以使用套接字,但需要做很多工作才能使它们可用,例如代理支持、https、进度事件等...列表很长,强烈建议我使用 HTTPWebRequest,唯一的问题是我需要带有响应的原始标头,我尝试下载的网站会发送一个非常长且奇怪的 cookie,该 cookie 不由 HTTPWebRequest、WebClient 处理。 Wordpress 博客,无法使用 WebClient 登录任何 wordpress 博客,但是通过 Sockets 手动 cookie 处理它可以完美运行,可能是 WebClient 中的一个错误。

1) 只需要原始标头即可。

2) 还有article link

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

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

【问题讨论】:

    标签: c# .net windows sockets httpwebrequest


    【解决方案1】:

    有一种方法可以获取原始标头:

    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
    

    这能解决您的问题吗?

    关于 Sockets 而不是 WebRequests - 我建议不要使用这种方法。它正在重新发明轮子。

    更新

    这并不能解决问题,因为上面的标头已经以有损方式进行了解析(有关详细信息,请参阅 cmets)。经过仔细检查,我得出结论,在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 硬引用。总而言之,您必须重新实现整个堆栈。

    因此,除非您可以更改网站行为或在没有这些 cookie 的情况下生活,否则您将需要使用 Socket。如果是这样,我想表示哀悼。

    【讨论】:

    • wordpress_c2d1208bd3bc2294298da94d67693495=+;看到这个,这不是一个完整的 cookie,它会坏掉,现在尝试使用套接字,你会得到完整的 cookie。
    • 好的,现在我明白了。真的很奇怪(以下是单个 cookie,由 firefox 解释): wordpress_test_cookie=WP+Cookie+check;路径=/
    • 还有wordpress_c2d1208bd3bc2294298da94d67693495=+;部分,实际上类似于 wordpress_6e7750f6a474de23330d1b7f0e9990c6=admin%7C1301039544%7C16d39b9f49cf062500d50471df7320e9;但断成一半。
    • 进程中涉及的内部类中有一个私有字段useUnsafeHeaderParsing,默认设置为false。不幸的是,将其设置为 true 并没有帮助。深入挖掘...
    • 我也遇到过这种情况,特别是对于重复的标题(例如 Set-Cookie)或任何带有嵌入逗号的东西。他们存储字符串 blob,然后实际上以逗号分隔 GetValues!
    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 2017-09-25
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多