Web API服务——如何在服务器上并发地执行请求

本文关键字:并发 服务器 执行 请求 API 服务 Web | 更新日期: 2023-09-27 18:04:55

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

所有的web请求都是并行执行和异步处理的吗?

一个webApi服务,默认情况下,并行执行所有传入的请求,但只有当当前多个请求(在特定时间)来自不同的会话时才执行。也就是说,如果单个客户端同时向服务器发送一些请求,那么所有的请求都将按顺序执行,而不会并发执行

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

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

Web API服务——如何在服务器上并发地执行请求

实际上,禁用会话状态是web api的正常解决方案。如果你需要一些/所有的调用,你可以调用HttpContext。SetSessionStateBehavior(例如,来自Application_BeginRequest)。多个只读会话状态请求可以并发运行

是否尝试异步任务?以下是示例控制器:

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;
        }
    }