我创建了一个程序,试图在网站上发布一个字符串,但我得到了这个错误:
"服务器违反了协议。部分=ResponseStatusLine"
出现这个错误是在以下代码行之后:
gResponse = (HttpWebResponse)gRequest.GetResponse();
我该如何修复这个异常?
我创建了一个程序,试图在网站上发布一个字符串,但我得到了这个错误:
"服务器违反了协议。部分=ResponseStatusLine"
出现这个错误是在以下代码行之后:
gResponse = (HttpWebResponse)gRequest.GetResponse();
我该如何修复这个异常?
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
如果这不起作用,您也可以尝试将KeepAlive
属性设置为false。
UserAgent
为空(在我的情况下是在github.com api中)。WebClient
的快速代码行:https://dev59.com/iM-yz4gBFxS5KdRjTgW1#11841680 - user586399HttpClient
查询GitHub,请添加以下代码以解决问题:client.DefaultRequestHeaders.Add("User-Agent", "Anything");
。 - Cihan YakarNo Content
),但同时定义了一个响应体。这个答案提醒我以及其他人永远不要再返回带有响应体的NoContent
响应。204响应不得包含消息正文,因此始终在标头字段之后的第一行空行处终止。
NoContent()
响应时,我遇到了The server committed a protocol violation. Section=ResponseStatusLine
错误,并在响应中发送了一些奇怪的No Content
。当我将其删除后,问题就解决了 :) - Intrepidreturn Request.CreateResponse(HttpStatusCode.NoContent, someContent);
中删除 someContent
来修复。 +1 - snippetkid另一个可能性是:在进行POST请求时,服务器用错误的方式响应100 continue。
这对我来说解决了问题:
request.ServicePoint.Expect100Continue = false;
var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false;
- user2444499许多解决方案都谈论了一些解决方法,但并没有涉及到错误的实际原因。
可能导致这个错误的一个原因是如果Web服务器使用的编码不是ASCII或ISO-8859-1来输出头响应部分。如果Response-Phrase
包含扩展拉丁字符,则使用ISO-8859-1
的原因是。
这个错误的另一个可能原因是,Web服务器使用输出字节顺序标记(BOM)的UTF-8
。例如,常量Encoding.UTF8
默认输出BOM,并且很容易忘记这一点。网页在Firefox和Chrome中工作正常,但是HttpWebRequest
将会崩溃 : )。一个快速的解决方法是将Web服务器更改为使用不输出BOM的UTF-8
编码,例如new UTF8Encoding(false)
(只要Response-Phrase
只包含ASCII字符就可以),但实际上它应该使用ASCII
或ISO-8859-1
用于头响应,然后使用UTF-8
或其他编码用于响应。
将期望的100继续设置为false,并将套接字空闲时间减少到两秒,这对我解决了问题。
ServicePointManager.Expect100Continue = false;
ServicePointManager. MaxServicePointIdleTime = 2000;
服务器违反了协议。部分=ResponseStatusLine。
尝试了一些解决方法后,只有以下两种解决方案对我有效:
HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ProtocolVersion = HttpVersion.Version10;
并且
HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ServicePoint.Expect100Continue = false;