我正在通过HttpWebRequest / HttpWebResponse对象向网站发出请求。
我正在几次成功调用该网站,并且对同一动态页面的每次其他调用都失败了。
在调试器中我收到“内部服务器错误500”fiddler也显示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块。
编辑:关闭fiddler我在调试器中得到了这个
编辑:所以,从我看到的HttpWebResponse对象开始相应的行动。服务器只是片状,有时会返回具有不同http状态代码的相同精确数据。为了快速修复,我只是将每个调用包装在try / catch和catch块中,只是重新编写完全相同的调用。到目前为止它工作得很好并且半证明它是站点错误而不是HttpWebResponse对象。
The server committed a protocol violation. Section=ResponseStatusLine
答案 0 :(得分:1)
HTTP 304响应意味着自您上次点击页面以来页面内容没有发生变化(他们可能正在使用缓存)。不经常点击页面或缓存响应以便在遇到此情况时使用。
修改强>
服务器正在发送包含数据的无效304响应。这违反了HTTP规范,HttpWebResponse / Fiddler正在有效地将其转换为500.
修改强>
如果您在app.config中使用以下设置,则可以继续使用HttpWebRequest
/ HttpWebResponse
:
<configuration>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
</configuration>
答案 1 :(得分:0)
Hei Jon,
没有Fiddler会有同样的结果吗? (只是在屏幕上打印例外)。我有时遇到调试器错误行为的麻烦。
如果服务器返回间歇性错误而你无法控制它,恐怕你做不了多少。消息似乎很明显,这是304的标准,响应不应该有一个正文,但服务器可以做任何想做的事情,所以要解决它几乎是它的问题。
参见W3C:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
如果客户端执行了条件GET请求并且访问权限是 允许,但文档尚未修改,服务器应该回复此状态代码。 304响应必须不包含消息体,因此总是在头字段之后的第一个空行终止。
关于HttpWebRequest,我从来没有遇到任何问题,也从未听说过任何无法处理HTTP通信的情况。但是,如果您希望自己疯狂处理数据包,Google将如何使用套接字构建您自己的HttpWebRequest。
这个项目可能是一个开始: http://www.codeproject.com/Articles/13486/A-Simple-Crawler-Using-C-Sockets