2012-01-09 70 views
3

我正在通过HttpWebRequest/HttpWebResponse对象向网站发出请求。HttpWebResponse.GetResponse()fiddler说:“响应头解析失败。”

我正在对该网站进行几次成功的调用,并且对同一动态页面的每个其他调用都失败。

在调试器中,我得到一个“内部服务器错误500”小提琴手也显示出500的响应,包含:

[Fiddler] Response Header parsing failed. 
This can be caused by an illegal HTTP response earlier on this reused server socket--  for instance, a HTTP/304 response which illegally contains a body. 
Response Data: 
<plaintext> 
0D 0A 3C 21 44 4F 43 54 59 50 45 20 48 54 4D 4C 20 50 55 42 4C 49 43 20 ..<!DOCTYPE  HTML PUBLIC 
22 2D 2F 2F 57 33 43 2F 2F 44 54 44 20 48 54 4D 4C 20 34 2E 30 20 54 72 "-//W3C//DTD HTML 4.0 Tr 
61 6E 73 69 74 69 6F 6E 61 6C 2F 2F 45 4E 22 3E 0D 0A 3C 48 54 4D 4C 3E ansitional//EN">..<HTML> 
0D 0A 09 3C 48 45 41 44 3E 0D 0A 09 09 3C 74 69 74 6C 65 3E 56 69 65 77 ...<HEAD>....<title>View 

我已经删除了所有的十六进制和浏览网页并为我所期望返回,但由于某种原因,服务器报告500,并且HttpWebRequest对象在此上引发异常。

我试过所有其他“修复”这个问题,没有工作。它可能只是从服务器发送的格式错误的数据,但是有比使用HttpWebRequest更低级别的对象而不是皮塔可以使用?

编辑:我没有在上面的例子中包含整个十六进制/整个html块。
编辑:关闭提琴手我得到这个在调试器

编辑:所以,从我所看到的在HttpWebResponse对象采取相应的行动。该服务器只是片状,有时用不同的http状态码返回相同的确切数据。为了快速解决问题,我只是将每个调用包装在try/catch中,并在catch块中调用完全相同的调用。到目前为止,它工作的很好,并且证明它是网站的错误,而不是HttpWebResponse对象。

The server committed a protocol violation. Section=ResponseStatusLine 
+1

你有比你想打的网站控制? – 2012-01-09 00:04:36

+0

@ M.Babcock我不知道。到目前为止,它看起来像我可以从500响应剥离HTML并解析,但这会很臭! – user1231231412 2012-01-09 00:06:45

+0

@Amadan这是一个winforms应用程序。 – user1231231412 2012-01-09 00:20:12

回答

0

喜乔恩,

的是没有Fiddler的结果相同? (只是在屏幕上打印例外)。我有时会遇到调试器不当行为的麻烦。

如果服务器返回间歇性错误并且您无法控制它,恐怕您不能做太多。消息似乎很清楚,这是304的一个标准,即响应不应该有一个主体,但服务器可以做任何想要的事情,所以它几乎是它的问题。

见W3C:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

如果客户端已经执行了条件GET请求和访问是 允许的,但文件没有被修改,服务器应该与此状态码。 304响应不能包含消息体,因此总是由头字段后的第一个空行终止。

关于HttpWebRequest,我从来没有任何问题,从来没有听说过任何情况下它不能处理HTTP通信。但是如果你想要自己去处理数据包,谷歌如何用套接字建立你自己的HttpWebRequest。

这个项目可能是一个开始: http://www.codeproject.com/Articles/13486/A-Simple-Crawler-Using-C-Sockets

+0

感谢您的链接,这看起来像一个很好的项目。 – user1231231412 2012-01-26 18:08:11

1

HTTP 304响应表示自上次访问页面(它们很可能使用缓存)后页面内容未发生变化。遇到这种情况时,不要频繁地点击页面或缓存响应。

EDIT

服务器发送包含数据无效304响应。这违反了HTTP规范,并且HttpWebResponse/Fiddler正在有效地将其转换为500。

编辑

您可以使用HttpWebRequest/HttpWebResponse保持如果你使用你的app.config以下设置:

<configuration> 
    <system.net> 
     <settings> 
      <httpWebRequest useUnsafeHeaderParsing="true" /> 
     </settings> 
    </system.net> 
</configuration> 
+0

在第一页点击我收集了一些我正在下载的文件的链接,每个后续点击到该网站是相同的“下载”网址,但具有不同的查询字符串参数。我认为这会阻止缓存,但这可能只适用于特定的配置。 – user1231231412 2012-01-09 00:18:49

+0

这将取决于他们的缓存系统有多复杂,显然这不是非常生成畸形的HTTP响应。 – 2012-01-09 00:21:45

+0

这是一个.NET 1.1网站,并且有很大的格式错误的html,因此可能不会:) – user1231231412 2012-01-09 00:24:31