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>