5

次の問題があります。

クライアント証明書を使用したHTTPS要求のみを受け入れるIIS8でWCFアプリケーションをホストしています。このサービスは、サイズが異なる可能性のあるPOSTメッセージ(数バイトから最大1 GB)を受け入れ、ほとんどの場合並行して受信されます。

次の場合、クライアントは413Requestエンティティの応答が大きすぎます。

  • 同じクライアント証明書で複数の接続が開かれ、多くの小さなファイルがアップロードされた場合。この場合、1つの要求は成功し、他のすべての要求は413エラーで失敗します。

uploadReadAheadSizeこの問題は、構成のセクションにあるすべての並列呼び出しサイズの合計よりも大きい値に値を設定することで解決できますsystem.webServer/serverRuntimeが、これにより、サーバーは呼び出しごとに先読みバッファーに全量のメモリーを割り当てます。同時呼び出しが多い場合、サーバーのメモリが不足します。

私の構成は、異なるクライアント証明書を使用して呼び出しが行われた場合、または1つの大きなファイルをアップロードした場合に機能します。

SSLAlwaysNegoClientCertIIS 6では、同様のバグを修正するために構成を設定するオプションがあったことを読みました。この値を設定するための回避策を試しましたが、IIS8.0を使用しても成功しませんでした。また、SSLクライアントキャッシュをオフにしてSSLセッションの再開を無効にしようとしましたが、それでも問題は解決しませんでした。

413エラーの原因は何ですか?サーバーのメモリ全体を使用せずに、同じサーバーへのクライアント証明書を使用した複数の並列アップロードを有効にする方法はありますか?

4

1 に答える 1

1

推測:

クライアントの再ネゴシエーションが要求された場合、SSL プリロードを使用して要求エンティティ ボディをプリロードする必要があります。SSL プリロードは、ISAPI 拡張に使用される UploadReadAheadSize メタベース プロパティの値を使用します。ただし、UploadReadAheadSize がコンテンツの長さよりも小さい場合は、HTTP 413 エラーが返され、デッドロックを防ぐために接続が閉じられます。(デッドロックは、サーバーが再ネゴシエーションの完了を待機している間に、クライアントが要求エンティティの送信の完了を待機しているために発生しますが、再ネゴシエーションでは、クライアントがデータを送信できる必要がありますが、これは実行できません)。

(記事Client cannot renegotiate request and returns an HTTP 413 error (IIS 6.0)より)

クライアントの再ネゴシエーションは SSLAlwaysNegoClientCert が設定されていない場合に発生するため、OpenSSL を使用して有効になっているかどうかを確認してください (この質問を参照してください)。私はIIS 8を使用していませんが、IIS 7.5では、リンクした質問からSSLAlwaysNegoClientCertを有効にする両方の方法が機能します。

于 2014-04-07T08:24:20.250 に答える