C# WCF上的Ajax多请求是同步处理的,而不是异步处理的

C# WCF上的Ajax多请求是同步处理的,而不是异步处理的,c#,ajax,multithreading,wcf,session,C#,Ajax,Multithreading,Wcf,Session,希望你们能简单地帮我解决这个问题:) 我在云端某处有一个WCF服务,运行良好。我使用的是PerCall和Single,与常规wcf没有什么特别不同 我的问题如下: 当使用web客户机(例如ajax)发送http GET请求时,对请求的处理不会以我想要的方式进行反应。让我用一段简短的代码来解释我的观点: [ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequireme

希望你们能简单地帮我解决这个问题:)

我在云端某处有一个WCF服务,运行良好。我使用的是PerCall和Single,与常规wcf没有什么特别不同

我的问题如下:

当使用web客户机(例如ajax)发送http GET请求时,对请求的处理不会以我想要的方式进行反应。让我用一段简短的代码来解释我的观点:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class Api
{
    [OperationContract]
    [WebInvoke(UriTemplate = "api/Function1", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
    public String Function1()
    {
        logMessage("Function1 -> Begin on thread " + Thread.CurrentThread.ManagedThreadId);
        System.Threading.Thread.Sleep(3000);
        logMessage("Function1 -> End on thread " + Thread.CurrentThread.ManagedThreadId);
        return "Function1 done";
    }

    [OperationContract]
    [WebInvoke(UriTemplate = "api/Function2", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
    public String Function2()
    {
        logMessage("Function2 -> Begin on thread " + Thread.CurrentThread.ManagedThreadId);
        System.Threading.Thread.Sleep(3000);
        logMessage("Function2 -> End on thread " + Thread.CurrentThread.ManagedThreadId);
        return "Function2 done";
    }

    [OperationContract]
    [WebInvoke(UriTemplate = "api/Function3", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json)]
    public String Function3()
    {
        logMessage("Function3 -> Begin on thread " + Thread.CurrentThread.ManagedThreadId);
        System.Threading.Thread.Sleep(3000);
        logMessage("Function3 -> End on thread " + Thread.CurrentThread.ManagedThreadId);
        return "Function3 done";
    }
}
和客户端代码:

var json1 = new XMLHttpRequest();
json1.open("GET", "127.0.0.1:81/api/Function1", true);
json1.setRequestHeader("Accept", "*/*");
json1.onload = function (e) {
  alert("function1 done");
}
var json2 = new XMLHttpRequest();
json2.open("GET", "127.0.0.1:81/api/Function2", true);
json2.setRequestHeader("Accept", "*/*");
json2.onload = function (e) {
  alert("function2 done");
}
var json3 = new XMLHttpRequest();
json3.open("GET", "127.0.0.1:81/api/Function3", true);
json3.setRequestHeader("Accept", "*/*");
json3.onload = function (e) {
  alert("function3 done");
}
json1.send(NULL);
json2.send(NULL);
json3.send(NULL);
我在这个WCF中有多个函数,我希望在调用它们时将它们异步处理。每个测试都有3秒钟的线程睡眠

因为我正在从web客户端异步发送3个请求,所以我应该等待3秒钟,同时接收所有响应(如果它确实是异步的,那么应该在不同的线程上处理)

根据我在网上已经读到的内容,当向WCF服务发送请求时,它会在会话中存储一个ID,该ID对于从同一会话发送的每个http请求都是相同的。如果会话相同,处理将在同一线程上完成,一个请求接一个请求,就像FIFO一样。为了确定问题是由于会话造成的,我尝试同时从两个不同的浏览器(chrome和firefox)发送这些请求,并且工作正常(很好,我的意思是请求在两个不同的线程上处理)。以下是一个会话的测试日志:

10:50:00 - Log service - Function1 on thread 9 -> Begin
10:50:03 - Log service - Function1 on thread 9 -> End
10:50:03 - Log service - Function2 on thread 9 -> Begin
10:50:06 - Log service - Function2 on thread 9 -> End
10:50:06 - Log service - Function3 on thread 9 -> Begin
10:50:09 - Log service - Function3 on thread 9 -> End
以下是两个会话同时进行的日志:

10:50:00 - Log service - Function 1 on thread 9 -> Begin
10:50:00 - Log service - Function 1 on thread 10 -> Begin
10:50:03 - Log service - Function 1 on thread 9 -> End
10:50:03 - Log service - Function 1 on thread 10 -> End

10:50:03 - Log service - Function 2 on thread 9 -> Begin
10:50:03 - Log service - Function 2 on thread 10 -> Begin
10:50:06 - Log service - Function 2 on thread 9 -> End
10:50:06 - Log service - Function 2 on thread 10 -> End

10:50:06 - Log service - Function 3 on thread 9 -> Begin
10:50:06 - Log service - Function 3 on thread 10 -> Begin
10:50:09 - Log service - Function 3 on thread 9 -> End
10:50:09 - Log service - Function 3 on thread 10 -> End
这就是我在等待的一次会议:

    10:50:00 - Log service - Function 1 on thread 9 -> Begin
    10:50:00 - Log service - Function 2 on thread 10 -> Begin
    10:50:00 - Log service - Function 3 on thread 11 -> Begin

    10:50:03 - Log service - Function 1 on thread 9 -> End
    10:50:03 - Log service - Function 2 on thread 10 -> End
    10:50:03 - Log service - Function 3 on thread 11 -> End

在不禁用会话的情况下解决该问题有什么想法吗?我希望我对每个人都很清楚,提前谢谢:)

如果您指定了
并发模式,这种行为会改变吗?多个
?我尝试了几个更改,多个而不是单个,PerSession而不是PerCall,添加了一些内容,但没有任何更改。您也尝试过在ASP.NET之外运行它吗,作为自托管WCF服务?我没有,但在使用ios和android客户端时(因为没有再次设置会话),我仍然会尝试自托管,只是为了确保看到与ASP.NET主机相同的行为: