2

外部パートナーから IIS 7.5 サーバーに不正な形式の (難読化された) JSON トラフィックが着信しているため、逆シリアル化しようとすると例外がスローされます。この特定のコンテンツには、JSON 本文に特定の署名があります。つまり{"a":[...] }、省略記号は、値を持つ他の多くの単一文字キーです。

これらの受信リクエストを除外する HttpModule を作成しましたが、これは正常に機能しており、不正な形式の JSON に関連する例外はなくなりました。唯一の問題は、リクエスト本文の内容を掘り下げるたびに、サーバーによって報告される 500 レベルのタイムアウトがゆっくりではあるが着実に上昇していることに気付いていることです (以下に示すように)。それらは大規模ではなく、サーバーごとに 1 分あたり約 5 件のみであり、1 分あたり 10,000 件以上のリクエストを処理しています。

このモジュールのほとんどのコードは次のとおりです。

        // read in the stream
        byte[] streamBuffer = new byte[app.Context.Request.InputStream.Length];

        ...

        app.Context.Request.InputStream.Read(streamBuffer, 0, readLength);
        app.Context.Request.InputStream.Position = 0;
        string body = "";
        body = Encoding.ASCII.GetString(streamBuffer, 0, readLength);

        ...

        // compare it to bad JSON
        matchesBadRequest = body.StartsWith(BAD_JSON_REQUEST, StringComparison.OrdinalIgnoreCase);

        ...

        // if signature matches, send back a 500 error.
        app.Context.Response.StatusCode = 500;
        app.Context.ApplicationInstance.CompleteRequest();

問題を切り分けるために私が行ったことは次のとおりです。

  • 私は本文を読んでコメントアウトし、タイムアウトを取得しません (もちろん、一致することはありません)。これにより、これが重要な領域であるという確信がかなり持てます。

  • 文字列の一致が遅いために何かが遅くなった場合に備えて、一致チェックを削除しました。readLength署名の一致に十分な自信が持てるので、サイズを 6 文字に維持しました。ボディ全体を消費しようとはしていません。

  • 応答ステータス コードを取得し、一致が見つかったときに要求を完了しました (例外を通過させます)。それでもタイムアウトが発生します。

  • 応答ステータス コードを 400 に、さらには 200 に変更しましたが、同じ数の 500 レベルのタイムアウトが発生しています。これに対する補足として、1 分間に約 300 以上の不適切な JSON 呼び出しが行われるため、1 分間に約 5 のタイムアウトとは相関しません。

これを念頭に置いて、TTL が短い可能性のある一部のリクエストでは、ストリームの読み取りがプロセスを少し遅くしすぎているのではないかと考えています。長いです。タイムアウトになっている正確なリクエストを特定できていないので、ストリーム読み取りレベルでできることがあるかどうかを確認しようとしています。

ここで説明する理由により、本文の解析に StreamReader を使用していません

前もって感謝します。どんな助けでも大歓迎です!

4

0 に答える 0