Ответ 1
Если вы используете ASP.NET, они используют блокировки чтения/записи для объекта Session. Это делает запрос AJAX серийным.
В ASP.NET у вас могут быть IHttpHandlers, которые реализуют IReadOnlySessionState, которые не будут размещать блокировку чтения/записи на сеансе. Не уверен, какая среда вы используете.
Изменить 1
В этом сообщении показано, что службы WCF не позволяют вам разблокировать сеанс:
Как заставить IIS размещать WCF или ASMX [webservice] для использования объекта сеанса readonly?
Изменить 2
Настройка IHttpHandler, который не будет блокировать объект Session.
Web.config
<configuration>
<connectionStrings>
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<add name="MyProvider" path="MyProvider.aspx" verb="*" type="MyNamespace.MyProvider" resourceType="Unspecified" />
</handlers>
</system.webServer>
</configuration>
MyProvider.cs
using System;
using System.Web;
using System.Web.SessionState;
namespace MyNamespace
{
public class MyProvider : IHttpHandler, IReadOnlySessionState
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
}
}
}
Если вы хотите создать поставщика, который получает и возвращает объекты JSON, вы можете создавать классы для запроса и ответа, а затем ваш обработчик может быть настроен следующим образом:
MyProvider.cs(обработка объектов JSON)
using System;
using System.Runtime.Serialization.Json;
using System.Web;
using System.Web.SessionState;
namespace TestWebsite
{
public class MyProvider : IHttpHandler, IReadOnlySessionState
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
var response = new Json.Response();
try
{
var requestSerializer = new DataContractJsonSerializer(typeof(Json.Request));
var request = (Json.Request)requestSerializer.ReadObject(context.Request.InputStream);
// ...
}
catch (Exception ex)
{
response.Error = ex.ToString();
}
try
{
var responseSerializer = new DataContractJsonSerializer(typeof(Json.Response));
context.Response.ContentType = "application/json";
responseSerializer.WriteObject(context.Response.OutputStream, response);
}
catch (Exception)
{
throw;
}
}
}
}