C#: HttpClient, сервер совершил нарушение протокола. Section=ResponseStatusLine

Я использую С помощью HttpClient класс для связи с веб-службой в моем приложении WPF.

когда я делаю последовательные запросы GET на том же соединении, все работает нормально. Однако, когда я делаю последовательные запросы PUT/PATCH на одно и то же соединение, первый запрос выполняется точно, и я получаю ответ, но второй запрос не включает тело в запрос, и я получаю печально известную ошибку "сервер совершил нарушение протокола. Раздел=ResponseStatusLine".

мои запросы завершаются успешно, если я вручную закрываю соединение после каждого запроса, добавляя подключение: закрыть в заголовок. Это" решение " является плохим шаблоном, и производительность не будет масштабироваться соответствующим образом.

ниже debranded версия список мой выходной поток 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

обратите внимание, что второй патч отсутствует объект должен патч. Если я изменю порядок исправления, второй патч все еще не имеет своего объекта.

эта ошибка, по-видимому, распространена с несколькими известными решениями, которые я пробовал. Они состоят из данное решение который включает в себя установку свойства useUnsafeHeaderParsing в TRUE и установка свойства Keep-Alive в FALSE в Интернете.Конфиг. Я также попробовал решение установка этих свойств таким образом, как показано ниже:

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

ни одно из этих решений работал. Следует отметить, что при использовании HTTP Debugging proxy tool, Fiddler, для захвата этих запросов я не получаю никаких ошибок.

Итак, я прошу, если кто-нибудь знает хорошее решение для устранения этой ошибки, чтобы я мог сделать несколько запросов в соединении, не теряя тело обновления. Если потребуется больше деталей,я буду рад предоставить их.

2 ответов


основная проблема заключается в том, что ответ патча включает содержимое в теле ответа. Убедитесь, что сервер не отправляет контент при отправке 204 No Content.


после долгой отладки и чтения я понял, что пытаюсь редактировать интернет.Конфигурационный файл приложения WPF вместо приложения.файл config!

Итак, если вы отбросите этот код в app.config файл в корне тега конфигурации для приложения WPF устраняет проблему.

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