Ami*_*nja 9 c# asp.net-mvc multithreading session-state asp.net-web-api
我正在使用由IIS 7.5托管的WebApi休息服务控制器,我从这篇文章中了解到:
一的WebAPI服务,默认情况下,并行执行所有传入的请求,但只有当目前的多个请求(在某一时刻)的来源不同的会话. 也就是说,如果单个客户端将同时向服务器发送一些请求,则所有这些请求将按顺序执行,并且不会同时执行.
这种行为对我们来说是一个真正的问题,因为在某些情况下,我们的客户端会异步地(通过浏览器)从不同客户端的侦听器发送大量请求,并且所有这些请求实际上都会排队,而不是在服务器上同时执行.因此,在某些情况下,我们遇到了严重的性能问题,这些问题在客户的网页上非常明显.
我们怎样才能解决这个问题?我知道我们可以 禁用会话状态,但这不是正常的事情.
实际上,禁用会话状态是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;
}
}
Run Code Online (Sandbox Code Playgroud)