C# Web Api-在同时执行几个请求时响应非常慢

C# Web Api-在同时执行几个请求时响应非常慢,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我有一个Web API C项目。我注意到,当一起发送几个请求时,有几个甚至可能是7-10到控制器,有些请求需要很长的时间5-7秒。单独发送每个请求时,每个请求所需时间少于200毫秒。我正在向本地主机开发环境发送请求,因此服务器上不应该有任何延迟或大量使用 我在global.asax中添加了这段代码,以便查看每个请求需要多长时间 //全球asax 专用字典urlTimers=新字典; 无效应用程序\u开始请求对象发送方,事件参数e { HttpContextBase currentContext

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

我在global.asax中添加了这段代码,以便查看每个请求需要多长时间

//全球asax 专用字典urlTimers=新字典; 无效应用程序\u开始请求对象发送方,事件参数e { HttpContextBase currentContext=新的HttpContextWrapperHttpContext.Current; var requestedUrl=currentContext.Request.RequestContext.HttpContext.Request.RawUrl; var urlWithoutQueryParams=requestedUrl.Split'?'[0]; 如果urlWithoutQueryParams.StartsWith/controller { var秒表=新秒表; 秒表。无查询参数的StartUrl; urlTimers[URLwithout查询参数]=秒表; } } 无效应用程序\u EndRequestobject发送方,事件参数e { HttpContextBase currentContext=新的HttpContextWrapperHttpContext.Current; var requestedUrl=currentContext.Request.RequestContext.HttpContext.Request.RawUrl; var urlWithoutQueryParams=requestedUrl.Split'?'[0]; 如果urlWithoutQueryParams.StartsWith/controller { var stopWatch=urlTimers[urlWithoutQueryParams]; 如果秒表!=null { 秒表,停; } } } 我将假设,除了MVC 5或更低版本之外,Global.asax和其他所有版本还没有出现MVC 6 Web Api。人们在MVC5WebAPI中忘记的一件事是SessionState。 关于这方面的几篇短文:

简言之,可以归结为:

使用SessionState enable,每个用户会话一次只处理一个请求。 在您的情况下,这意味着:

已处理GetAsKeyValuePairs 然后处理GetTranslationManagementData 然后处理iscaptionexist ... 它们都是在同一时间被请求的,因此它们具有相同的开始时间。 但是,请求的结束时间取决于以前请求所需的时间+它自己的处理时间。这会导致样本中每次调用的时间增加

如果您的操作无法访问会话信息,则可以“安全地”在控制器上添加[SessionStateSessionStateBehavior.ReadOnly]属性。 这将导致呼叫同时被处理。只是不要在更改会话信息的控制器上使用它。

我假设这还不是一个MVC 6 Web Api存在的Global.asax和除MVC 5或更低版本之外的所有版本。人们在MVC5WebAPI中忘记的一件事是SessionState。 关于这方面的几篇短文:

简言之,可以归结为:

使用SessionState enable,每个用户会话一次只处理一个请求。 在您的情况下,这意味着:

已处理GetAsKeyValuePairs 然后处理GetTranslationManagementData 然后处理iscaptionexist ... 它们都是在同一时间被请求的,因此它们具有相同的开始时间。 但是,请求的结束时间取决于以前请求所需的时间+它自己的处理时间。这会导致样本中每次调用的时间增加

如果您的操作无法访问会话信息,则可以“安全地”在控制器上添加[SessionStateSessionStateBehavior.ReadOnly]属性。
这将导致呼叫同时被处理。不要在更改会话信息的控制器上使用此选项。

非常感谢您的帮助。你真的救了我。使用[SessionStateSessionStateBehavior.ReadOnly]我仍然可以读取会话吗?如果我理解正确,现在我为每个请求获得了会话的克隆?您仍然可以读取它们,甚至可以更改它们,但不值得,因为它可能带来的问题。像这样看。正常会话状态行为在请求启动时锁定会话,并在请求结束时解除锁定。使用readonly时,没有锁。2次调用可以更改相同的数据,因此只能读取数据。将sessionstate视为用户会话中的单例。非常感谢。我真的很感谢你的帮助。你真的救了我。使用[SessionStateSessionStateBehavior.ReadOnly]我仍然可以读取会话吗?如果我理解正确,现在我为每个请求获得了会话的克隆?您仍然可以读取它们,甚至可以更改它们,但不值得,因为它可能带来的问题。像这样看。正常会话状态行为在请求启动时锁定会话,并在请求结束时解除锁定。使用readonly时,没有锁。2次调用可以更改相同的数据,因此只能读取数据。将sessionstate视为用户会话中的单例。非常感谢。真的帮了我