Web Api - 同时执行少量请求时响应速度非常慢

时间:2018-03-27 13:48:17

标签: c# asp.net asp.net-web-api

我有一个Web API C#项目。我注意到,当向控制器发送一些请求(很少甚至可能是7-10)时,一些请求需要很长时间(5-7秒)。单独发送每个请求时,每个请求的时间不到200毫秒。我将请求发送到我的localhost(开发环境),因此服务器上不应该有任何延迟或大量使用。

我在global.asax中添加了此代码,以便查看每个请求所需的时间。



//Global asax

 private Dictionary<string, StopWatch> urlTimers = new Dictionary<string, StopWatch>();
    void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current);
        var requestedUrl = currentContext.Request.RequestContext.HttpContext.Request.RawUrl;
        var urlWithoutQueryParams = requestedUrl.Split('?')[0];
        if (urlWithoutQueryParams.StartsWith("/controller"))
        {
            var stopWatch = new StopWatch();
            stopWatch.Start(urlWithoutQueryParams);
            urlTimers[urlWithoutQueryParams] = stopWatch;
        }

     
    }

    void Application_EndRequest(object sender, EventArgs e)
    {
        HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current);
        var requestedUrl = currentContext.Request.RequestContext.HttpContext.Request.RawUrl;
        var urlWithoutQueryParams = requestedUrl.Split('?')[0];
        if (urlWithoutQueryParams.StartsWith("/controller"))
        {
            var stopWatch = urlTimers[urlWithoutQueryParams];
            if (stopWatch != null)
            {
                stopWatch.Stop();
            }
        }
    }
&#13;
&#13;
&#13;

使用fiddler提交10个请求时,我会收到以下内容

enter image description here

所有请求都返回少量数据,因此也不应该是问题所在。 10个请求花费这么多时间是没有意义的。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

我将假设这还不是MVC 6 Web Api(存在Global.asax和所有)但MVC 5或更低版本。人们在MVC 5 Web API中忘记的一件事是SessionState。 关于此的一些简短博客:

简而言之,归结为:

启用SessionState后,每个用户会话一次只能处理一个请求。 在你的情况下,这意味着:

  • 处理了GetAsKeyValuePairs
  • 然后处理GetTranslationManagmentData
  • 然后处理IsCaptionsExist
  • ...

它们都是同时请求的,因此它们具有相同的开始时间。 但是,请求的结束时间取决于先前请求所需的时间+它自己的处理时间。这会导致样本中每次调用的时间增加。

如果您的操作无法访问会话信息,您可以“安全地”在控制器上添加[SessionState(SessionStateBehavior.ReadOnly)]属性(请参阅博客)。 这将导致调用同时进行。只是不要在更改会话信息的控制器上使用它。