当我收到服务器协议冲突异常时,如何获得响应?

Posted

技术标签:

【中文标题】当我收到服务器协议冲突异常时,如何获得响应?【英文标题】:How do I get to the response when I recieve a ServerProtocolViolation exception? 【发布时间】:2015-08-06 18:25:42 【问题描述】:

我正在尝试向带有 html 服务器的远程传感器发出 HttpWebRequest 以拉回数据。

我认为问题在于 Web 服务器存在一些问题。我可以让网页在网络浏览器中呈现,并且数据是可见的。这就是我要解析并存储到关系数据库中的数据。

当我查看 Fiddler 中的响应标头时,我可以看到它返回了 500 Bad Response。所以,我认为正在发生的是,标题说 Bad Response 但无论如何都包含有效的网页。

我认为我无法修复 Web 服务器。我只想抓取数据并解析它。不幸的是,响应对象为空。

抛出的错误是 WebExceptionStatus.ServerProtocolViolation 并且在 catch 分支中,响应为空。

在这种情况下我能做什么?

更新:

另一个问题是没有 HTML 标签。以下是 Fiddler 的原始返回响应:

HTTP/1.1 500 Fiddler - Bad Response
Date: Thu, 06 Aug 2015 18:13:27 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Cache-Control: no-cache, must-revalidate
Timestamp: 14:13:27.775

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="refresh" content="5"/>
<meta http-equiv="cache-control" content="no-cache">
<title>IQS WebServer</title>
<style type="text/css">
    body font-family: Tahoma, Verdana, Arial, sans-serif; font-size: 0.8em;
    table /*font-size: 0.8em;*/ /*font-family: monospace;*/
    .CaptionRow font-weight:bold; background: #EFF3EB;
    .OddRow background: #EFF3EB;
</style>
</head>

那里有一具尸体。

我不知道为什么它会抛出 500 以及为什么没有 HTML 标记,但我并不真正关心响应的格式有多糟糕 - 我真的只想获取响应并处理包含的数据无论如何,但图书馆不允许它在其中。响应为空,因此我被卡住了。

【问题讨论】:

哦,我已经尝试设置 KeepAlive = false。我也尝试将 ProtocolVersion 切换到 Version10 和 Version11 都没有任何效果。这些似乎是对其他人有用的常用技巧。 WebException 上有一个 Response 属性。我记不太清了,但可能是在错误条件下,响应会发生在哪里。 对,所以一旦你在 catch 分支,你必须像这样转换 e.Response:(HttpWebResponse)e.Response。我的问题是响应为空。它只是不存在。除非它确实存在,但图书馆选择将其保留为空。 【参考方案1】:

https://msdn.microsoft.com/en-us/library/65ha8tzh(v=vs.110).aspx “默认情况下,.NET Framework 严格执行 RFC 2616 进行 URI 解析。某些服务器响应可能包含禁止字段中的控制字符,这将导致 HttpWebRequest.GetResponse() 方法抛出 WebException。如果将 useUnsafeHeaderParsing 设置为 true,则 HttpWebRequest .GetResponse() 在这种情况下不会抛出;但是,您的应用程序将容易受到多种形式的 URI 解析攻击。最好的解决方案是更改服务器,使响应不包含控制字符。"

另一个常见的相关问题是服务器只发送 LF 行结尾,而 HTTP 需要 CRLF。您必须查看十六进制才能区分,否则它是不可见的。 useUnsafeHeaderParsing 在这里也应该有所帮助。

【讨论】:

我在 app.config 文件中设置了 useUnsafeHeaderParsing = Yes,这并没有什么不同。我无法访问 Response 对象,因为它为空。 我还设置了 maximumErrorResponseLength = -1 和 maximumResponseHeadersLength = -1,这也没有影响。响应对象为空。 使用 Python 就是这么简单。恐怕今天这对.NET 来说是一个损失。这应该是在几分钟内完成的简单任务。

以上是关于当我收到服务器协议冲突异常时,如何获得响应?的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 HTTP 协议尝试请求时,为啥会收到错误的请求响应?

Spring 5 Reactive 中的 HTTP 响应异常处理

C#:是不是可以获得异常触发器? [复制]

无法建立 SSL 连接,请参阅内部异常

Spring Boot 使用来自服务器响应的数据编辑 json 异常

服务器提交了协议冲突. Section=ResponseStatusLine