I'm working on my local development environment using angular to issue ajax calls to Web.API (IIS 8.5 hosted). I'm making 5 calls via different angular controllers simultaneously, each of which look like this:
$scope.medications = API.Client.MedicationProfiles.query({ clientId: clientId });
The API service has this definition for the Client.MedicationProfiles resource:
this.Client.MedicationProfiles = $resource(
'/Noteable.API/api/Client/:clientId/MedicationProfiles/:id',
{
clientId: '@clientId',
id: '@Id'
},
{
update: { method: 'PUT' }
}
);
I can see all of the requests going to the server basically at once using the chrome dev tools as the page loads but it appeared that they were coming back one at a time as if they had been run synchronously. I put a thread.sleep in one of the Web.API controller actions and sure enough, all calls issued after that one fail to return until the sleeping one does. This doesn't make any sense to me and I'm wondering if someone can tell me in what case they would expect this.
This may be a good situation to implement an asynchronous pattern on your web api backend - you'll be alleviated from your ajax calls blocking once they hit your controller. This can be achieved by leveraging an async
and await
pattern. You'll want to return a Task
, which represents an asynchronous operation.
An example may include...
public async Task<IHttpActionResult> Put(string clientId)
{
var response = await this.yourService.yourSavingMethod(clientId);
return Ok(response);
}
Also see SO question Why is this web api controller not concurrent? for more details and insight on the issue. Furthermore, the default behavior for ASP.NET Session State and can be changed to accommodate concurrent requests. An example may include
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly)