C# 导致超时的HttpModule请求正文
我有一些格式错误(模糊)的JSON通信从外部合作伙伴进入IIS 7.5服务器,这导致在尝试反序列化它时引发异常。这个特定的内容在JSON主体中有一个特定的签名,即C# 导致超时的HttpModule请求正文,c#,.net,inputstream,httpmodule,C#,.net,Inputstream,Httpmodule,我有一些格式错误(模糊)的JSON通信从外部合作伙伴进入IIS 7.5服务器,这导致在尝试反序列化它时引发异常。这个特定的内容在JSON主体中有一个特定的签名,即{“a”:[…]},其中省略号是许多其他带有值的单字母键 我创建了一个HttpModule来过滤这些传入的请求,它工作正常,与格式错误的JSON相关的异常也消失了。唯一的问题是,每当我深入研究请求主体的内容时,我注意到服务器报告的500级超时缓慢但稳定地增加(如下所示)。它们并不广泛,每台服务器每分钟只处理5个请求,我们每分钟要处理10
{“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();
以下是我为隔离问题所做的工作:
- 我已经把读尸体的事讲完了,不要超时 (当然,除了没有匹配),所以这给了我 对这是一个关键领域有相当高的信心
- 我已经进行了匹配检查,以防字符串匹配速度慢
是什么让事情变慢了。我甚至将
的值保持在一个较低的水平 6个字符的大小,因为这让我对 签名匹配,所以我不想吃掉整个身体readLength
- 我已取出响应状态代码并完成请求 找到匹配项后(让异常通过),以及 它仍然导致超时
- 我已将响应状态代码更改为400甚至200,并且 仍然获得相同数量的500级超时。旁注 这是因为大约有300多个错误的JSON调用即将到来 每分钟通过,因此它与 大约每分钟5分钟
提前谢谢。欢迎任何帮助 你试过用更小的卡盘来读取流而不是整个流的长度吗?是的,在第二个要点中,我提到我在读取时将readLength限制为6个字符。或者你的意思是通过其他方式获得与InputStream.Read相同的数据?那么你读取前6个字符,然后重置位置?我想知道重置流位置是否会占用更多的时间。您可能需要为模块插入仪器,以隔离哪一行(读取流、设置位置等)实际占用的时间最多。我想知道您是否需要将
streamBuffer
设置为输入流的完整长度,而不是简单地按实际使用的大小分配。因为它是一个数组,所以它将被创建为内存中的一个连续对象,如果存在碎片和争用,您可能正在等待创建该空间。当然,这不太可能是问题所在,但这是值得考虑的问题。