10

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 を使用してこれらの要求をキャプチャしても、エラーは発生しないことに注意してください。

したがって、私が求めているのは、このエラーを軽減するための適切な解決策を誰かが知っているかどうかです。これにより、更新の本文を失うことなく、接続で複数の要求を行うことができます。詳細が必要な場合は、喜んで提供いたします。

4

2 に答える 2

10

多くのデバッグと読み取りを行った後、app.config ファイルではなく、WPF アプリケーションの Web.Config ファイルを編集しようとしていたことに気付きました。

したがって、このコードをapp.configファイルの WPF アプリケーションの構成タグのルートにドロップすると、問題が修正されます。

<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing = "true"/>
</settings>
</system.net>
于 2013-08-28T19:18:39.417 に答える
6

根本的な問題は、PATCH 応答の本文にコンテンツが含まれていることです。204 No Content を送信するときに、サーバーがコンテンツを送信しないことを確認します。

于 2013-08-28T21:03:21.943 に答える