MVC控制器响应缓慢

时间:2015-12-03 16:36:45

标签: c# json asp.net-mvc

我有一个奇怪的问题。

从控制器我收到非常慢的响应。到底是怎么回事。 我有一个从这个控制器到我们的后端软件的动态Web服务调用。来自后端的响应在大约30-500ms内处理。 序列化过程大约是0ms-10ms。

当控制器用24K的JsonData将数据返回到客户端(浏览器)时,它需要服务器大约2.8s和250ms来呈现响应,如果服务器返回,即300K的json数据,它只需要500ms到回复和1s渲染..我的方法。

到目前为止,我尝试将序列化从Json更改为JsonNet以计划字符串响应,但都是相同的。

    [HttpPost]
    public string RetriveMultiple(RequestParams model)
    {
        Stopwatch st = new Stopwatch();
        st.Start();

        var def = UI.GetDefinitionFor(model.ModuleName);

        var service = DynamicServiceProxy.DynamicServiceHelper.CreateWebService(model.RequestedEntity);

        ArrayList filters = new ArrayList();

        if (null != model.RequestFilters)
            foreach (var f in model.RequestFilters)
            {
                filters.Add(service.CreateFilter(f.Field, f.Criteria));
            }

        dynamic response = new string[0];
        try
        {
            response = service.ReadMultiple(filters, model.PageKey, model.PageSize != null ? (int)model.PageSize : 30);
        }
        catch
        {
            service = DynamicServiceProxy.DynamicServiceHelper.CreateWebService(model.RequestedEntity, true);
            response = service.ReadMultiple(filters, model.PageKey, model.PageSize != null ? (int)model.PageSize : 30);
        }

        st.Stop();
        LogHelper.Info<EntityServiceSurfaceController>(() => {
            return string.Concat("Search time ",  st.Elapsed.Milliseconds, "ms, row count ", response.Length );
        });

        st.Reset();
        st.Start();
        var r = Newtonsoft.Json.JsonConvert.SerializeObject(response);
        st.Stop();
        LogHelper.Info<EntityServiceSurfaceController>(() => {
            return string.Concat("Serialisation time ", st.Elapsed.Milliseconds, "ms, row count ", response.Length);
        });


        return r;
        //return new JsonNetResult
        //{
        //    Data = r
        //};
    }
}

秒表时间。

 2015-12-03 17:48:15,254  - Search time 295ms, row count 17
 2015-12-03 17:48:15,254 - Serialisation time 0ms, row count 17

Chrome timeline

Newtork times (Fiddler)

1 个答案:

答案 0 :(得分:-1)

它可能是ASP.NET过滤器吗?它们在操作方法之前和之后运行,并实现安全性和日志记录等功能。

检查全局注册的过滤器,通常在App_Start\FilterConfig.cs

        filters.Add(new HandleErrorAttribute());
        filters.Add(new DisallowJsonCachingAttribute());
        filters.Add(new ApplyJsonCacheControlAttribute());

另外,检查控制器是否有任何可疑过滤器。

我认为这种方法的速度很慢?还有其他人运作良好吗?