C#:HttpClient,服务器提交了协议违规。第= ResponseStatusLine

时间:2013-08-28 19:18:39

标签: c# wpf dotnet-httpclient

我正在使用HttpClient类与我的WPF应用程序中的Web服务进行通信。

当我在同一个连接上发出连续的GET请求时,一切正常。但是,当我在同一个连接上发出连续的PUT / PATCH请求时,第一个请求准确执行,我收到一个响应,但第二个请求不包括请求中的正文,我收到臭名昭着的错误“服务器提交协议违规.Section = ResponseStatusLine“。

如果我在每次请求后手动关闭连接,只需将连接:关闭添加到标头,我的请求就会成功完成。这种“解决方案”是一种糟糕的模式,性能无法适当扩展。

以下是我发送的请求中的TCP流输出列表的抵押版本:

Wireshark:关注TCP流输出

GET /domain/api/tenant/current/object?objectName=Lizbot HTTP/1.1
Accept: application/json

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Content-Length: 50
    {"Data":[{"Id":123,"ObjectName":"Lizbot","Date":null}],"Errors":[]}

PATCH /domain/api/tenant/current/object/123 HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
Content-Length: 50
{"Id":123,"ObjectName":"Lizbot","Date":null}

    HTTP/1.1 204 No Content
    Content-Type: application/json; charset=utf-8
    {"Data":null,"Errors":[]}

PATCH /domain/api/tenant/current/object/123/otherObject HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8

    HTTP/1.1 400 Bad Request</b>
    Content-Type: text/html; charset=us-ascii
    Connection: close
    Content-Length: 311

请注意,第二个PATCH缺少它应该修补的对象。如果我改变了PATCHing的顺序,第二个PATCH仍然缺少它的对象。

这个错误似乎与我尝试过的一些已知解决方案相同。它们由this solution组成,其中包括将useUnsafeHeaderParsing属性设置为 TRUE ,并在Web.Config中将Keep-Alive属性设置为 FALSE 。我还尝试了以下所示的方式设置这些属性的解决方案:

 ServicePointManager.DefaultConnectionLimit = 2;
 ServicePointManager.Expect100Continue = false;

这些解决方案都没有奏效。需要注意的是,当使用Http Debugging代理工具Fiddler来捕获这些请求时,我没有收到任何错误。

所以我要求的是,如果有人知道一个很好的解决方案来缓解这个错误,那么我可以在连接中发出多个请求而不会丢失更新的主体。如果需要更多细节,我很乐意提供。

2 个答案:

答案 0 :(得分:10)

经过大量的调试和阅读后,我意识到我正在尝试编辑WPF应用程序的Web.Config文件而不是app.config文件!

因此,如果将此代码放在WPF应用程序配置标记根目录下的 app.config 文件中,则可以解决问题。

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

答案 1 :(得分:6)

潜在的问题是PATCH响应包括响应主体内的内容。确保在发送204 No Content时服务器不发送内容。