Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 导致超时的HttpModule请求正文_C#_.net_Inputstream_Httpmodule - Fatal编程技术网

C# 导致超时的HttpModule请求正文

C# 导致超时的HttpModule请求正文,c#,.net,inputstream,httpmodule,C#,.net,Inputstream,Httpmodule,我有一些格式错误(模糊)的JSON通信从外部合作伙伴进入IIS 7.5服务器,这导致在尝试反序列化它时引发异常。这个特定的内容在JSON主体中有一个特定的签名,即{“a”:[…]},其中省略号是许多其他带有值的单字母键 我创建了一个HttpModule来过滤这些传入的请求,它工作正常,与格式错误的JSON相关的异常也消失了。唯一的问题是,每当我深入研究请求主体的内容时,我注意到服务器报告的500级超时缓慢但稳定地增加(如下所示)。它们并不广泛,每台服务器每分钟只处理5个请求,我们每分钟要处理10

我有一些格式错误(模糊)的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来解析主体


提前谢谢。欢迎任何帮助

你试过用更小的卡盘来读取流而不是整个流的长度吗?是的,在第二个要点中,我提到我在读取时将readLength限制为6个字符。或者你的意思是通过其他方式获得与InputStream.Read相同的数据?那么你读取前6个字符,然后重置位置?我想知道重置流位置是否会占用更多的时间。您可能需要为模块插入仪器,以隔离哪一行(读取流、设置位置等)实际占用的时间最多。我想知道您是否需要将
streamBuffer
设置为输入流的完整长度,而不是简单地按实际使用的大小分配。因为它是一个数组,所以它将被创建为内存中的一个连续对象,如果存在碎片和争用,您可能正在等待创建该空间。当然,这不太可能是问题所在,但这是值得考虑的问题。