2

我有一些格式错误(混淆)的 JSON 流量从外部合作伙伴进入我们的 IIS 7.5 服务器,这导致在尝试反序列化时引发异常。此特定内容在 JSON 正文中具有一定的签名,即{"a":[...] }省略号是许多其他带有值的单字母键。

我创建了一个 HttpModule 来过滤掉这些传入的请求,它工作正常,并且与格式错误的 JSON 相关的异常消失了。唯一的问题是,每当我深入研究请求正文的内容时,我注意到服务器报告的 500 级超时缓慢但稳定地上升(如下所示)。它们并不广泛,每台服务器每分钟只有大约 5 个,我们每分钟处理 10k+ 个请求。

以下是该模块的大部分代码:

        // 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 级超时。附带说明一下,每分钟大约有 300 多个错误的 JSON 调用通过,因此它与大约每分钟 5 次的超时无关。

考虑到这一点,我想知道对于某些可能具有短 TTL 的请求,读取流是否只是使进程减慢了太多,并且我们开始看到所描述的问题,因为它们也一直在等待长。我无法确定正在超时的确切请求,所以我试图看看是否有任何可以在流读取级别完成的事情。

由于此处描述的原因,我没有使用 StreamReader 来解析正文。

提前致谢。非常欢迎任何帮助!

4

0 回答 0