问题描述:
- 客户端js连续发起两个异步http请求,请求地址相同,但参数不同;POST http://*.*.*.*/*****/webservice/RESTFulWebService/RESTFulHandlerForWeb.ashx HTTP/1.1
- 服务器端第二方法的响应时间明显很长(不正常),在ProcessRequest方法上增加日志后发现,第二个方法的开始时间明显延迟了大约0.5秒
- 后台跟踪发现累计SQL执行时间不超过50毫秒;
使用log记录应用处理的响应时间(11表示handler方法开始,22表示handler结束),结果发现:两个http请求,从服务器端处理的时间上来看是很短的;
RedGate分析
通过redgate抓取服务器端的处理堆栈,发现两个http请的处理方式不一样。
第一个请求的处理堆栈如下(这是一个普通的、正常的堆栈):
第二个请求额处理堆栈如下(可以看到time队列及sessionState关键字):
查阅资料显示,如果HttpHandler实现了IRequiresSessionState接口,会导致同一个客户端的并发请求被串行化。解决办法:去掉该接口或改为IReadOnlySessionState
根据堆栈提出找到对应的handler代码,果然实现了该接口,至此问题解决。