我有一个Web控制器,里面有以下方法:
public string Tester()
{
Thread.Sleep(2000);
return "OK";
}
当我调用它10次(使用Fiddler)时,我期望所有10个调用在大约2秒后返回。然而,调用分别在2,4,8.20秒后返回。是什么阻止它同时运行呢?我该怎么解决这个问题?
常规控制器的行为是否与web控制器相同?
发布于 2014-11-04 14:06:22
您描述的内容与ASP.NET会话状态的默认行为相匹配,可以通过在web.config中禁用它来解决。
对ASP.NET会话状态的访问是每个会话的独占性,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问。但是,如果对同一个会话发出两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的独占访问。第二请求仅在第一请求完成后执行。(如果释放了信息上的独占锁,则第二个会话也可以访问,因为第一个请求超过了锁定超时。)如果@ Page指令中的EnableSessionState值设置为ReadOnly,则对只读会话信息的请求不会导致对会话数据的独占锁定。但是,会话数据的只读请求可能仍然需要等待由会话数据的读-写请求设置的锁清除。
来源:ASP.NET会话状态概述
发布于 2014-11-04 14:38:04
我不认为我是在回答你的问题,但我想在这里写的太大了,不能发表评论。
首先,ASP.NET Web与会话状态无关。实际上,如果会话必须与web一起使用,则需要显式启用它。
现在,我有和您一样的完全相同的API控制器,并且我把它托管在IIS中。如果我发出并发请求,它将并行运行请求,而不是串行运行。下面是我从Fiddler那里测试的方法。
首先,我访问了API并等待了200个状态代码( Fiddler左窗格中的#1)。然后,我选择#1并按U无条件地重复同样的请求9次。这样,左窗格中就有10个请求(#1到# 10 )。然后,我选择了所有的10个,并按R,以重新发出所有的10个请求并行。然后,我在左窗格中选择了请求11到20,然后转到Timeline选项卡。我看到这张图了。
PS。我测试了在本地运行的web,BTW。
接下来,我想记录由action方法接收到的时间戳请求。因此,我修改了action方法以返回这样的字符串。
public string Get()
{
string ts = DateTime.Now.ToString("mm:ss.fff");
Thread.Sleep(2000);
return ts;
}
我有以下几条。
00:43.795
00:43.795
00:45.812
00:44.517
00:43.795
00:43.795
00:45.515
00:43.795
00:43.795
00:43.795
对我来说,这意味着所有的请求都是并行运行的。
发布于 2014-11-04 13:24:50
看看这个问题,它与您的问题相关:是否所有web请求都并行执行并异步处理?
它指出:
默认情况下,webApi服务并行执行其所有传入请求,但前提是当前多个请求(特定时间)来自不同的会话。也就是说,如果单个客户端同时向服务器发送一些请求,则所有请求都将按顺序执行,不会同时执行。
要解决这个问题,您可以使用异步方法,如描述的这里。
通常,您需要将方法声明为异步,如下所示:
public async Task<MyObj> GetObj()
https://stackoverflow.com/questions/26736034
复制相似问题