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

man*_*tel 109 c# httpwebrequest

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

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

在这行代码之后:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个异常?

Dar*_*rov 70

试着把它放在你的app/web.config中:

<system.net>
    <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
</system.net>
Run Code Online (Sandbox Code Playgroud)

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

  • 这仅仅是避免问题而不是实际修复问题.我认为这不应该是默认解决方案. (23认同)
  • 我有6个网址抛出这个错误.设置useUnsafeHeaderParsing为一个链接修复它,但设置KeepAlive = false为所有6个修复它. (3认同)
  • 对于非Web应用程序,可以在App.copnfig的<configuration> root标签内放置相同的内容(例如,我修复了WPF应用程序 - 谢谢!). (3认同)
  • 同意Tobias - 你正在避免这个问题.现在可能是问题在服务器中你无法解决,因此避免可能是你唯一的选择......但是,让我们清楚地避免协议错误和实际修复之间的区别. (3认同)
  • 只设置KeepAlive = false为我创造了奇迹. (2认同)

Iva*_*kin 57

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

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

  • 啊这就是我需要的.谢谢.以下是用户代理示例:http://stackoverflow.com/a/15144495/891976 (5认同)
  • 谢谢.如果你想查询**GitHub**通过`HttpClient`添加:`client.DefaultRequestHeaders.Add("User-Agent","Anything");`line for fix. (5认同)

Tob*_*ias 29

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

此行为是一致10.2.5 204无内容的的HTTP规范它说:

204响应绝不能包含消息体,因此总是在头字段之后的第一个空行终止.

  • 这也是我的问题,尽管这很棘手,因为“无内容”响应之后的调用失败了。 (2认同)

mar*_*arq 11

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

这解决了我的问题:

request.ServicePoint.Expect100Continue = false;
Run Code Online (Sandbox Code Playgroud)

  • 我知道我迟到了但是,你以"不正确的方式"是什么意思? (3认同)

Luk*_*uke 9

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

想法由此页面提供


Din*_*ruz 8

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

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


Loa*_*ing 8

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

导致此错误的一个可能原因是,如果Web服务器使用除以外的编码ASCIIISO-8859-1输出标头响应部分.使用的原因ISO-8859-1是如果Response-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或者响应的一些其他编码).


Pra*_*tap 6

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

ServicePointManager.Expect100Continue = false; 
ServicePointManager. MaxServicePointIdleTime = 2000; 
Run Code Online (Sandbox Code Playgroud)


Alt*_*F4_ 6

Skype是我问题的主要原因:

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

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

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

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

如下所述,一旦完成就执行IIS重置.

  • 并记得在执行此操作后重新启动IIS (2认同)