Skip to main content
 首页 » 编程设计

c#之Web Api之同时执行几个请求时响应真的很慢

2024年02月04日31freeliver54

我有一个 Web API C# 项目。我注意到当向 Controller 发送几个请求时(很少甚至可以是 7-10 个),一些请求会花费很长时间(5-7 秒)。单独发送每个请求时,每个请求耗时不到200ms。我正在向我的本地主机(开发环境)发送请求,因此服务器上不应有任何延迟或大量使用。

我在 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(); 
            } 
        } 
    }

当使用 fiddler 提交 10 个请求时,我收到以下信息

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

请您参考如下方法:

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

简而言之,它归结为:

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

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

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

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