服务器违反了协议。部分=响应状态行错误。

121

我创建了一个程序,试图在网站上发布一个字符串,但我得到了这个错误:

"服务器违反了协议。部分=ResponseStatusLine"

出现这个错误是在以下代码行之后:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

我该如何修复这个异常?

18个回答

74
尝试将以下内容放入你的 app/web.config 文件中:
<system.net>
    <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
</system.net>

如果这不起作用,您也可以尝试将KeepAlive属性设置为false。


3
我有6个URL出现了这个错误。设置useUnsafeHeaderParsing只能修复一个链接的问题,但将KeepAlive设置为false则可以修复所有6个链接的问题。 - David Hammond
3
同样的方法也适用于非 Web 应用程序,在 App.config 文件中 <configuration> 根标签内部放置(例如,我就是通过这种方式修复了 WPF 应用程序 - 谢谢!)。 - Yury Schkatula
28
仅仅是回避问题,而不是真正解决问题。我认为这不应该成为默认方案。 - Tobias
4
同意Tobias的观点-你正在回避问题。现在,也许问题出在你无法修复的服务器上,因此回避可能是你唯一的选择...但是,让我们明确回避协议错误和实际修复它之间的区别。 - metaforge
1
useUnsafeHeaderParsing、allowKeepAlive和expect100Continue不起作用。 - Magento Nav
显示剩余7条评论

62
有时候出现这个错误是因为请求参数UserAgent为空(在我的情况下是在github.com api中)。
将该参数设置为自定义的非空字符串解决了我的问题。

5
好的,这是我需要的。谢谢。以下是一个用户代理的示例:https://dev59.com/YGnWa4cB1Zd3GeqP4dFO#15144495 - David Ruhmann
在这里使用WebClient的快速代码行:https://dev59.com/iM-yz4gBFxS5KdRjTgW1#11841680 - user586399
5
感谢您。如果您想通过HttpClient查询GitHub,请添加以下代码以解决问题:client.DefaultRequestHeaders.Add("User-Agent", "Anything"); - Cihan Yakar

39
在我的情况下,罪魁祸首是返回了一个没有内容的响应(No Content),但同时定义了一个响应体。这个答案提醒我以及其他人永远不要再返回带有响应体的NoContent响应。
这种行为与HTTP规范中的10.2.5 204 No Content一致,该规范在HTTP规范中说明:

204响应不得包含消息正文,因此始终在标头字段之后的第一行空行处终止。


在使用WebApi返回自定义的NoContent()响应时,我遇到了The server committed a protocol violation. Section=ResponseStatusLine错误,并在响应中发送了一些奇怪的No Content。当我将其删除后,问题就解决了 :) - Intrepid
5
这也是我的问题,尽管它很棘手,因为在“无内容”响应之后的通话失败了。 - mdickin
通过从 return Request.CreateResponse(HttpStatusCode.NoContent, someContent); 中删除 someContent 来修复。 +1 - snippetkid
这也是我的问题所在,无内容响应后的下一个调用/请求失败了,这发生在我的集成测试中,因此下一个集成测试也失败了...感谢@Tobias指出这一点,我花了5个小时解决它! - vasilisdmr
这解决了我 LabVIEW 的网络服务问题,谢谢!提示:在 LabVIEW 返回 204 时不要刷新任何(甚至是空)字符串。 - eternal_frame
这对我的LabVIEW webservice解决了问题,谢谢!提示:在LabVIEW中返回204时,不要刷新任何(即使是空的)字符串。 - undefined

13

另一个可能性是:在进行POST请求时,服务器用错误的方式响应100 continue。

这对我来说解决了问题:

request.ServicePoint.Expect100Continue = false;

在访问 MediaFire API 时,这对我很有效。 - AlexPi
3
我知道我来晚了,但是你所说的“以一种不正确的方式”是什么意思? - kuskmen
1
对于任何使用 HttpClient 的人,以下方法适用于我: var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false; - user2444499

10

许多解决方案都谈论了一些解决方法,但并没有涉及到错误的实际原因。

可能导致这个错误的一个原因是如果Web服务器使用的编码不是ASCII或ISO-8859-1来输出头响应部分。如果Response-Phrase包含扩展拉丁字符,则使用ISO-8859-1的原因是。

这个错误的另一个可能原因是,Web服务器使用输出字节顺序标记(BOM)的UTF-8。例如,常量Encoding.UTF8 默认输出BOM,并且很容易忘记这一点。网页在Firefox和Chrome中工作正常,但是HttpWebRequest将会崩溃 : )。一个快速的解决方法是将Web服务器更改为使用不输出BOM的UTF-8编码,例如new UTF8Encoding(false)(只要Response-Phrase只包含ASCII字符就可以),但实际上它应该使用ASCIIISO-8859-1用于头响应,然后使用UTF-8或其他编码用于响应。


1
这是最好的回复。它解释了为什么Web服务器表现不佳。谢谢!(由于HttpListener的部署问题,我必须使用套接字来模拟Web服务器。) - Andrew Rondeau

9

遇到了同样的问题。结果发现是Skype造成的。很不幸,无法提供适当的错误信息。 - jordan koskei
你其实不需要关闭Skype,我在下面添加了一个答案来展示如何在不关闭Skype的情况下解决它。 - AltF4_

9
有一种方法可以调试此问题(并确保是协议违规导致了问题),那就是使用 Fiddler(Http Web 代理),看看是否会出现相同的错误。如果没有出现(即 Fiddler 已为您处理了该问题),那么您应该能够使用 UseUnsafeHeaderParsing 标志进行修复。
如果您正在寻找一种以编程方式设置此值的方法,请参阅此处的示例:http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline/

Fiddler确实解决了我使用GET HTTP请求时遇到的问题。我们能看到Fiddler所做的工作吗? - anon

6

将期望的100继续设置为false,并将套接字空闲时间减少到两秒,这对我解决了问题。

ServicePointManager.Expect100Continue = false; 
ServicePointManager. MaxServicePointIdleTime = 2000; 

6
Skype是我问题的主要原因:
当您设置Visual Studio来调试已在IIS而不是内置ASP.NET调试Web服务器中运行的现有Web应用程序时,通常会出现此错误。 IIS默认侦听端口80上的Web请求。在这种情况下,另一个应用程序已经在端口80上侦听请求。通常,有问题的应用程序是Skype,它在安装时默认接管侦听端口80和443。 Skype已经占据了端口80。因此,IIS无法启动。
为了解决此问题,请按照以下步骤操作:
Skype->工具->选项->高级->连接:
取消选中“将端口80和443用作传入连接的替代方案”。
并如下所指出,完成后执行IIS重置。

2
请记得在完成操作后重新启动IIS。 - Ahmed Galal

3
我尝试通过代理访问Last.fm Rest API,但是遇到了著名的错误:

服务器违反了协议。部分=ResponseStatusLine。

尝试了一些解决方法后,只有以下两种解决方案对我有效:

HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ProtocolVersion = HttpVersion.Version10;

并且

HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ServicePoint.Expect100Continue = false;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接