我有一些格式错误(混淆)的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来解析正文described here.
提前致谢。非常欢迎任何帮助!