Web API服务 - 如何使服务器上的请求同时执行

时间:2014-05-25 13:52:14

标签: c# asp.net-mvc multithreading asp.net-web-api session-state

我正在使用由IIS 7.5托管的WebApi休息服务控制器, 正如我从这篇文章中所理解的那样:

Are all the web requests executed in parallel and handled asynchronously?

默认情况下, webApi 服务会并行执行所有传入请求,但仅,如果当前多个请求(在某些情况下)时间)来自不同的会议。 也就是说,如果单个客户端会向服务器发送一些同时请求,则所有这些请求将顺序执行并且不会同时执行

这种行为对我们来说是一个真正的问题,因为在某些情况下,我们的客户端会异步地(通过浏览器)从不同客户端的侦听器发送大量请求,并且所有这些请求实际上都是排队而不是在服务器上同时执行 。因此,在某些情况下,我们遇到了严重的性能问题,这些问题在客户的网页上非常明显。

我们如何解决这个问题? 我知道我们可以禁用会话状态,但这不是正常的事情。

2 个答案:

答案 0 :(得分:5)

实际上,禁用会话状态是Web API的普通解决方案。如果您需要拨打部分/全部电话,可以拨打HttpContext.SetSessionStateBehavior(例如,从Application_BeginRequest)。多个只读会话状态请求可以同时运行。

答案 1 :(得分:1)

您是否尝试过异步任务?这是示例控制器:

public class SendJobController : ApiController
    {
        public async Task<ResponseEntity<SendJobResponse>> Post([FromBody] SendJobRequest request)
        {
            return await PostAsync(request);
        }

        private async Task<ResponseEntity<SendJobResponse>> PostAsync(SendJobRequest request)
        {
            Task<ResponseEntity<SendJobResponse>> t = new Task<ResponseEntity<SendJobResponse>>(() =>
            {
                ResponseEntity<SendJobResponse> _response = new ResponseEntity<SendJobResponse>();

                try
                {
                    //  
                    // some long process
                    // 
                    _response.responseStatus = "OK"; 
                    _response.responseMessage = "Success";
                    _response.responseObject = new SendJobResponse() { JobId = 1 };

                }
                catch (Exception ex)
                {
                    _response.responseStatus = "ERROR"; 
                    _response.responseMessage = ex.Message;
                }

                return _response;
            });

            t.Start();
            return await t;
        }
    }