服务器违反了协议

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

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

在这行代码之后:

gResponse = (HttpWebResponse)gRequest.GetResponse();

我如何修复这个异常?

175195 次浏览

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

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

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

One way to debug this (and to make sure it is the protocol violation that is causing the problem), is to use Fiddler (Http Web Proxy) and see if the same error occurs. If it doesn't (i.e. Fiddler handled the issue for you) then you should be able to fix it using the UseUnsafeHeaderParsing flag.

If you are looking for a way to set this value programatically see the examples here: http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline/

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

这解决了我的问题:

request.ServicePoint.Expect100Continue = false;

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

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

UserAgent请求参数为空时(在我的例子中是 github.com api) ,有时会发生此错误。

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

在我的案例中,罪魁祸首是返回一个 No Content响应,但同时定义了一个响应主体。愿这个答案再次提醒我和其他人。

这种行为与 HTTP 规范10.2.5204无内容是一致的,10.2.5204无内容说:

204响应必须不包括消息正文,因此总是 以标题字段后面的第一个空行结束。

没有一个解决方案对我有效,所以我不得不使用 WebClient 而不是 HttpWebRequest,问题就解决了。

我需要使用 CookieContainer,所以我使用了 Pavel Savara 在这个帖子中发布的解决方案 -在 WebClient 类中使用 CookieContainer

只需从这行删除“ protected”:

私有的只读 CookieContainer 容器 = 新的 CookieContainer () ;

许多解决方案只讨论解决方案,而不讨论错误的实际原因。

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

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

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

感谢本页提供的创意

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

我给了 IIS 用户相关目录的权限,一切正常。

查看代码并查找是否将某个头部设置为 NULL 或空值。

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

在客户端,我们卸载 VPN 客户端,重置互联网设置,然后重新安装 VPN 客户端。这个错误也可能是由以前的防病毒软件使用防火墙造成的。然后我们启用了动态内容压缩,现在它和以前一样工作得很好。

错误出现在自定义应用程序,连接到一个 Web 服务,也在 TFS。

我试图通过代理访问 Last.fm Rest API,得到了这个著名的错误。

服务器违反了协议

在尝试了一些变通之后,只有这两个对我有用

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

还有

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

Skype 是我问题的主要原因:

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

To resolve the issue follow the steps:

Skype-> Tools-> Options-> Advanced-> Connection:

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

正如下面指出的 执行 IIS 重置一旦完成。

我开始从我的 php JSON/REST 服务中得到这个错误

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

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

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

这个问题的一个可能原因是网络上的 Web 代理自动发现协议(WPAD)配置。HTTP 请求将透明地发送给代理,代理可以发回客户端不接受或配置为不接受的响应。在将代码破解成碎片之前,请检查 WPAD 是否正在运行,特别是如果这种情况只是突然“开始发生”。

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