C#:HttpClient,服务器违反了协议(protocol)。部分=响应状态行

标签 c# wpf dotnet-httpclient

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

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

如果我在每次请求后通过向 header 添加 Connection: close 手动关闭连接,我的请求就会成功完成。这个“解决方案”是一个糟糕的模式,性能将无法适当扩展。

下面是我发送的请求中的 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这涉及在 Web.Config 中将 useUnsafeHeaderParsing 属性设置为 TRUE 并将 Keep-Alive 属性设置为 FALSE。我还尝试了以如下所示的方式设置这些属性的解决方案:

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

这些解决方案均无效。应该注意的是,当使用 Http 调试代理工具 Fiddler 捕获这些请求时,我没有收到任何错误。

所以我要问的是,是否有人知道减轻此错误的好解决方案,以便我可以在一个连接中发出多个请求而不会丢失更新的主体。如果需要更多详细信息,我很乐意提供。

最佳答案

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

因此,如果您将此代码放入 WPF 应用程序配置标记根部的 app.config 文件中,它可以解决问题。

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

关于C#:HttpClient,服务器违反了协议(protocol)。部分=响应状态行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18496451/

相关文章:

c# - 将结构传递给非托管代码,从 C# DLL 到 VB6

c# - XNA Monogame 有效绘制原语

c# - WPF 图像控件 : Trigger stops working once Source is modified in code

c# - 如何防止 Visual Studio 显示应用程序洞察提醒?

c# - 如何获取用户登录我的应用程序的机器帐户?

wpf - Caliburn.Micro 消息冒泡跳过控件

c# - ComboBox SelectedItem 未显示其值

c# - 我应该缓存并重用从 HttpClientFactory 创建的 HttpClient 吗?

c# - ASP.NET Core 2 从 HttpResponseMessage 获取 cookie

asp.net-mvc-4 - 从 Mvc Controller 使用 WebApi - HttpClient 还是引用 API 程序集?