HttpModule请求正文导致超时

时间:2012-10-18 18:55:45

标签: c# .net inputstream httpmodule

我有一些格式错误(混淆)的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.

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

0 个答案:

没有答案