Answers:
尝试将其放在您的app / web.config中:
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
如果这不起作用,您也可以尝试将该KeepAlive
属性设置为false。
有时,当UserAgent
请求参数为空时会发生此错误(在我的情况下为github.com api)。
将此参数设置为自定义非空字符串可以解决我的问题。
WebClient
在此处使用的快速线stackoverflow.com/a/11841680/4795214
HttpClient
client.DefaultRequestHeaders.Add("User-Agent", "Anything");
在我的案例中,罪魁祸首是返回No Content
响应,但同时定义了响应主体。愿这个答案提醒我,也许其他人不要再NoContent
回覆尸体了。
此行为与HTTP规范的10.2.5 204 No Content一致,该内容为:
204响应必须不包含消息正文,因此始终由标头字段之后的第一个空行终止。
The server committed a protocol violation. Section=ResponseStatusLine
在使用WebApi返回自定义响应(由于某种奇怪的原因NoContent()
而发送响应)时收到错误后,只需阅读此内容No Content
!一旦我取出来,问题就消失了:)
someContent
从return Request.CreateResponse(HttpStatusCode.NoContent, someContent);
+1
另一种可能性:执行POST时,服务器以不正确的方式响应100继续。
这为我解决了问题:
request.ServicePoint.Expect100Continue = false;
var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false;
当我在本地计算机上运行Skype时,这就是我正在发生的事情。我关闭后,异常就消失了。
调试此问题(并确保是引起问题的协议冲突)的一种方法是使用Fiddler(Http Web代理),看看是否发生相同的错误。如果没有(即Fiddler为您解决了该问题),那么您应该能够使用UseUnsafeHeaderParsing标志对其进行修复。
如果您正在寻找以编程方式设置此值的方法,请参见此处的示例:http : //o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline /
许多解决方案都在讨论解决方法,但没有讨论错误的实际原因。
导致此错误的一个可能原因是,如果Web服务器使用的编码不是ASCII
或ISO-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字符的行就可以,但是实际上它应该使用ASCII
或ISO-8859-1
作为标题,然后UTF-8
或响应的其他一些编码)。
设置期望值100继续为false并将套接字空闲时间减少到两秒可以为我解决问题
ServicePointManager.Expect100Continue = false;
ServicePointManager. MaxServicePointIdleTime = 2000;
Skype是我遇到问题的主要原因:
当您将Visual Studio设置为调试在IIS中而不是内置的ASP.NET中运行的现有Web应用程序时,通常会发生此错误。调试Web服务器。IIS默认情况下在端口80上侦听Web请求。在这种情况下,另一个应用程序已经在端口80上侦听请求。通常,有问题的应用程序是Skype,默认情况下,Skype在安装时接管端口80和443的侦听。Skype已占用端口80。因此IIS无法启动。
要解决此问题,请按照下列步骤操作:
Skype->工具->选项->高级->连接:
取消选中“使用端口80和443作为传入连接的替代方法”。
并且如以下所指出的,执行一次IIS重置。
我尝试从代理后面访问Last.fm Rest API,并收到此著名错误。
服务器提交了违反协议的协议。Section = ResponseStatusLine
在尝试了一些解决方法后,只有这两个对我有用
HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ProtocolVersion = HttpVersion.Version10;
和
HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ServicePoint.Expect100Continue = false;
这些解决方案都不适合我,因此我不得不使用WebClient而不是HttpWebRequest,问题不再存在。
我需要使用CookieContainer,因此我在该线程中使用了Pavel Savara发布的解决方案- 将CookieContainer与WebClient类一起使用
只需从此行中删除“受保护”即可:
私有只读CookieContainer容器= new CookieContainer();
查看您的代码,查找是否要使用NULL或空值设置某些标头。