服务器提交了协议违规。 Section = ResponseStatusLine ERROR

时间:2010-03-20 10:50:52

标签: c# httpwebrequest

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

  

“服务器提交了协议违规.Section = ResponseStatusLine”

这段代码之后:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

如何修复此异常?

18 个答案:

答案 0 :(得分:69)

尝试将其放入app / web.config中:

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

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

答案 1 :(得分:57)

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

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

答案 2 :(得分:27)

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

此行为与HTTP specification 10.2.5 204无内容一致,表示:

  

204响应绝不能包含消息体,因此总是如此   由标题字段后的第一个空行终止。

答案 3 :(得分:10)

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

这解决了我的问题:

request.ServicePoint.Expect100Continue = false;

答案 4 :(得分:9)

当我在本地计算机上运行Skype时,这种情况正在发生。一旦我关闭,异常就消失了。

Idea courtesy of this page

答案 5 :(得分:8)

调试此方法(并确保它是导致问题的协议违规)的一种方法是使用Fiddler(Http Web代理)并查看是否发生相同的错误。如果没有(即Fiddler为您处理了问题),那么您应该能够使用UseUnsafeHeaderParsing标志来修复它。

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

答案 6 :(得分:8)

许多解决方案都在讨论解决方法,但不是关于错误的实际原因。

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

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

答案 7 :(得分:6)

设置expect 100继续为false并将套接字空闲时间减少到两秒就解决了我的问题

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

答案 8 :(得分:6)

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

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

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

Skype - &gt;工具 - &gt;选项 - &gt;高级 - &gt;连接:

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

如下所示执行IIS重置

答案 9 :(得分: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;

答案 10 :(得分:2)

没有一个解决方案适合我,所以我不得不使用WebClient而不是HttpWebRequest,问题就不复存在了。

我需要使用CookieContainer,因此我使用了Pavel Savara在此主题中发布的解决方案 - Using CookieContainer with WebClient class

只需删除&#34;受保护&#34;从这一行:

private readonly CookieContainer container = new CookieContainer();

答案 11 :(得分:2)

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

答案 12 :(得分:2)

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

答案 13 :(得分:1)

我们尝试过的第一件事是禁用IIS的动态内容压缩,解决了错误,但错误并未导致服务器端,只有一个客户端受此影响。

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

自定义应用程序中出现错误,该应用程序连接到Web服务以及TFS。

答案 14 :(得分:0)

我刚刚遇到了同样的问题。在我的特殊情况下,git 在签入时删除了 http 文件中的 CR,但不管原因,您可以按照以下步骤调试问题:https://technical.fail/posts/2021-01-26-dotnet-framework-throwing-the-server-committed-a-protocol-violation-section-responsestatusline

答案 15 :(得分:0)

我开始从我的php JSON / REST服务中获取此错误

在我将ob_start("ob_gzhandler")添加到最常访问的GET php脚本后,我开始从相对较少的POST上传中收到错误

我只能使用ob_start(),一切都很好。

答案 16 :(得分:0)

查看您的代码并查找是否使用NULL或空值设置某些标头。

答案 17 :(得分:0)

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

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