.NET上的Web服务是异步/同步吗?

时间:2013-12-03 15:39:41

标签: c# .net web-services asynchronous

我从客户端调用了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 />"); 
        }
    );
}

这是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() });
}

我的方面是asynch回复。

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

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

所以它根本不是异步的。

WebServices如何管理.NET中的客户端调用?我能完成整个过程吗?

修改

结果为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

所以它不是会话错误。

3 个答案:

答案 0 :(得分:5)

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

如果您没有使用会话,则不应启用它。


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

  

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

答案 1 :(得分:2)

它是异步的,因为该方法不会在javascript中阻塞,而是在操作完成时触发回调。

它可能是并行,也不是异步

请注意,大多数浏览器都会对发出的并发AJAX请求数量进行限制。你肯定无法一次发出30个请求。一般来说,你会看到几个,1-3左右。这就是为什么你通常会按顺序看到所有请求,而不是所有请求都在同一时间回来。

答案 2 :(得分:0)

WebService是由defualt通过线程。 如果您遇到问题,请尝试将Pool Size = 10或更多插入连接字符串, 注意如果你有一个常用的对象使用:

 lock (myObjList)
            {
                ...
            }