WPF アプリケーションで Web サービスと通信するためにHttpClientクラスを使用しています。
同じ接続で連続して GET リクエストを行うと、すべて正常に動作します。ただし、同じ接続で PUT/PATCH リクエストを連続して行うと、最初のリクエストは正確に実行され、レスポンスを受け取りますが、2 番目のリクエストはリクエストに本文が含まれておらず、「サーバーがプロトコルをコミットしました」という悪名高いエラーを受け取ります。違反。セクション=ResponseStatusLine".
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
2 番目の PATCH には、パッチを適用するはずのオブジェクトがないことに注意してください。PATCH の順序を変更すると、2 番目の PATCH にはまだオブジェクトがありません。
このエラーは、私が試したいくつかの既知の解決策に共通しているようです。それらは、Web.Config で useUnsafeHeaderParsing プロパティをTRUEに設定し、Keep-Alive プロパティをFALSEに設定することを含むこのソリューションで構成されています。以下に示すように、これらのプロパティをこの方法で設定するソリューションも試しました。
ServicePointManager.DefaultConnectionLimit = 2;
ServicePointManager.Expect100Continue = false;
これらの解決策はどれも機能しませんでした。Http デバッグ プロキシ ツールである Fiddler を使用してこれらの要求をキャプチャしても、エラーは発生しないことに注意してください。
したがって、私が求めているのは、このエラーを軽減するための適切な解決策を誰かが知っているかどうかです。これにより、更新の本文を失うことなく、接続で複数の要求を行うことができます。詳細が必要な場合は、喜んで提供いたします。