我创建了一个程序,试图在网站上发布一个字符串,我收到了这个错误:
“服务器提交了协议违规.Section = ResponseStatusLine”
这段代码之后:
gResponse = (HttpWebResponse)gRequest.GetResponse();
如何修复此异常?
答案 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时,这种情况正在发生。一旦我关闭,异常就消失了。
答案 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)
许多解决方案都在讨论解决方法,但不是关于错误的实际原因。
此错误的一个可能原因是,如果网络服务器使用ASCII
或ISO-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字符就可以,但实际上它应该使用ASCII
或ISO-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用户相关目录的权限,一切都很好。