服务器提交了违反协议的协议。Section = ResponseStatusLine错误


115

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

“服务器违反了协议。Section = ResponseStatusLine”

在这行代码之后:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

如何解决此异常?

Answers:


70

尝试将其放在您的app / web.config中:

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

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


3
我有6个网址抛出此错误。设置useUnsafeHeaderParsing可以将其修复为一个链接,但是设置KeepAlive = false可以将其修复为所有6个链接。–
David Hammond

3
对于非Web应用程序,可以在App.copnfig的<configuration>根标记中放置相同的内容(例如,我以这种方式修复了WPF应用程序-谢谢!)。
Yury Schkatula 2013年

有谁知道为什么IIS强制实施此安全措施?它有效,但是我不明白限制标头值的原因(在我的情况下手动设置它们)。
emran 2014年

26
这仅仅是避免问题,而不是实际解决问题。我认为这不应该是默认解决方案。
Tobias 2014年

4
同意Tobias-您可以避免这个问题。现在可能是问题出在无法修复的服务器上,因此避免可能是您唯一的选择……但是,让我们清楚地避免协议错误和实际修复它之间的区别。
metaforge 2014年

58

有时,当UserAgent请求参数为空时会发生此错误(在我的情况下为github.com api)。

将此参数设置为自定义非空字符串可以解决我的问题。


5
啊,这就是我所需要的。谢谢。这是一个用户代理示例:stackoverflow.com/a/15144495/891976
David Ruhmann 2014年

WebClient在此处使用的快速线stackoverflow.com/a/11841680/4795214

5
谢谢。如果要通过 add: 行查询GitHub,以进行修复。HttpClientclient.DefaultRequestHeaders.Add("User-Agent", "Anything");
Cihan Yakar '16

32

在我的案例中,罪魁祸首是返回No Content响应,但同时定义了响应主体。愿这个答案提醒我,也许其他人不要再NoContent回覆尸体了。

此行为与HTTP规范的10.2.5 204 No Content一致,该内容为:

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


The server committed a protocol violation. Section=ResponseStatusLine 在使用WebApi返回自定义响应(由于某种奇怪的原因NoContent()而发送响应)时收到错误后,只需阅读此内容No Content!一旦我取出来,问题就消失了:)
Intrepid In

2
这也是我的问题,尽管这很棘手,因为在无内容响应之后的调用失败了。
mdickin '16

通过去除固定someContentreturn Request.CreateResponse(HttpStatusCode.NoContent, someContent); +1
snippetkid

11

另一种可能性:执行POST时,服务器以不正确的方式响应100继续。

这为我解决了问题:

request.ServicePoint.Expect100Continue = false;

这在访问MediaFire API时对我有用。
AlexPi '02

3
我知道我来晚了,但是,“以不正确的方式”是什么意思?
kuskmen

1
对于使用HttpClient的任何人,以下对我var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false;
有用

9

当我在本地计算机上运行Skype时,这就是我正在发生的事情。我关闭后,异常就消失了。

此页面的想法礼貌


有同样的问题。原来是Skype。非常不幸,无法提供正确的消息。
jordan koskei

您实际上不需要关闭Skype,为此我在下面添加了一个答案,以显示如何在不关闭Skype的情况下解决该问题。
AltF4_

8

调试此问题(并确保是引起问题的协议冲突)的一种方法是使用Fiddler(Http Web代理),看看是否发生相同的错误。如果没有(即Fiddler为您解决了该问题),那么您应该能够使用UseUnsafeHeaderParsing标志对其进行修复。

如果您正在寻找以编程方式设置此值的方法,请参见此处的示例:http : //o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline /


Fiddler确实在解决我对GET HTTP请求的问题。我们能看到提琴手做什么吗?
奥利维尔·马特

8

许多解决方案都在讨论解决方法,但没有讨论错误的实际原因。

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

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


这是最好的回应。它解释了为什么Web服务器行为异常。谢谢!(由于HttpListener的部署问题,我不得不使用套接字模拟Web服务器。)
Andrew Rondeau

6

设置期望值100继续为false并将套接字空闲时间减少到两秒可以为我解决问题

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

6

Skype是我遇到问题的主要原因:

当您将Visual Studio设置为调试在IIS中而不是内置的ASP.NET中运行的现有Web应用程序时,通常会发生此错误调试Web服务器。IIS默认情况下在端口80上侦听Web请求。在这种情况下,另一个应用程序已经在端口80上侦听请求。通常,有问题的应用程序是Skype,默认情况下,Skype在安装时接管端口80和443的侦听。Skype已占用端口80。因此IIS无法启动。

要解决此问题,请按照下列步骤操作:

Skype->工具->选项->高级->连接:

取消选中“使用端口80和443作为传入连接的替代方法”。

并且如以下所指出的,执行一次IIS重置


2
并记得这样做后重新启动IIS
Ahmed Galal

3

我尝试从代理后面访问Last.fm Rest API,并收到此著名错误。

服务器提交了违反协议的协议。Section = ResponseStatusLine

在尝试了一些解决方法后,只有这两个对我有用

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

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

2

这些解决方案都不适合我,因此我不得不使用WebClient而不是HttpWebRequest,问题不再存在。

我需要使用CookieContainer,因此我在该线程中使用了Pavel Savara发布的解决方案- 将CookieContainer与WebClient类一起使用

只需从此行中删除“受保护”即可:

私有只读CookieContainer容器= new CookieContainer();


2

此问题的可能原因是网络上的Web代理自动发现协议(WPAD)配置。HTTP请求将透明地发送给代理,该代理可以发回客户端不接受或未配置为接受的响应。在将您的代码砍成碎片之前,请检查WPAD是否未起作用,特别是如果这只是突然开始的话。


2

我的问题是我用调用了https端点http


1

我们尝试的第一件事是为IIS禁用动态内容压缩,这解决了该错误,但该错误不是服务器端引起的,只有一个客户端受此影响。

在客户端,我们卸载了VPN客户端,重置了Internet设置,然后重新安装了VPN客户端。该错误也可能是由先前具有防火墙的防病毒引起的。然后,我们启用了反向动态内容压缩,现在它可以像以前一样正常工作。

在连接到Web服务的自定义应用程序以及TFS上均出现错误。


0

在我的情况下,IIS没有访问相关ASPX路径的必要权限。

我向IIS用户授予了相关目录的权限,一切都很好。



0

我开始从我的PHP JSON / REST服务中收到此错误

在我添加ob_start("ob_gzhandler")到最常访问的GET php脚本后,我开始从relativley罕见的POST上传中获取错误

我可以使用just ob_start(),一切都很好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.