WebServices是否在.NET上异步/同步?

mar*_*zzz 0 .net c# asynchronous web-services

我从客户端调用了30次WebService方法(asmx):

for (var i = 0; i < 30; i++) {
    WSCustom.Test(i,
        function (res) {
            $("#Results").append(res + "<br />");
        }, 
        function (res) { 
            $("#Results").append(res.get_message() + "<br />"); 
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

这是WebService方法:

[WebMethod(EnableSession = true)]
public string Test(int i)
{
    DateTime m_oStart = DateTime.Now;
    WebClient m_oClient = new WebClient();

    if (i % 2 == 0)
    {
        byte[] res = m_oClient.DownloadData("http://www.repubblica.it/");
    }

    return String.Format("TotalSeconds:{0}", new string[] { DateTime.Now.Subtract(m_oStart).TotalSeconds.ToString() });
}
Run Code Online (Sandbox Code Playgroud)

我的方面是asynch回复.

我的意思是,我应该立即得到15个回复(奇怪的是i它立即返回),并且在剩余的回复期间(需要时间下载页面服务器端).

但事实上,outpup是不同的:它立即处理第一个电话.比,它等待第二个完成,比我收到一些奇怪的i回复,依此类推.

所以它根本不是异步的.

WebServices如何管理.NET中的客户端调用?我可以在整个过程中执行asynch吗?

编辑

有了EnableSession = false这样的结果:

TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:1,514
TotalSeconds:0
TotalSeconds:1,857
TotalSeconds:0
TotalSeconds:2,143
TotalSeconds:0
TotalSeconds:1,88
TotalSeconds:0
TotalSeconds:3,178
TotalSeconds:0
TotalSeconds:3,562
TotalSeconds:2,095
TotalSeconds:0
TotalSeconds:0
TotalSeconds:4,221
TotalSeconds:1,749
TotalSeconds:0
TotalSeconds:0
TotalSeconds:3,717
TotalSeconds:0
TotalSeconds:1,977
TotalSeconds:2,421
TotalSeconds:2,439
TotalSeconds:1,807
TotalSeconds:2,124
Run Code Online (Sandbox Code Playgroud)

所以它不是会话错误.

Pad*_*ddy 5

你有EnableSession=true网络方法.这实际上是队列调用,因为会话对象将为每个请求锁定.

如果您不使用会话,则不应启用它.


来自http://msdn.microsoft.com/en-us/library/aa478952.aspx:

为了提供GetItemExclusive所需的排他性,会话状态提供程序必须实现一种锁定机制,以防止需要对会话状态进行读/写访问的两个或多个并发请求访问给定会话.该机制通过防止并发请求覆盖彼此的更改来确保会话状态的一致性.即使会话状态数据源是多个Web服务器共享的远程资源,锁定机制也必须工作.