我从客户端调用了30次WebService方法(asmx):
for (var i = 0; i < 30; i++) { WSCustom.Test(i, function (res) { $("#Results").append(res + "
"); }, function (res) { $("#Results").append(res.get_message() + "
"); } ); }
这是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中的客户端调用?我可以在整个过程中执行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
所以它不是会话错误.
你有EnableSession=true
网络方法.这实际上是队列调用,因为会话对象将为每个请求锁定.
如果您不使用会话,则不应启用它.
来自http://msdn.microsoft.com/en-us/library/aa478952.aspx:
为了提供GetItemExclusive所需的排他性,会话状态提供程序必须实现一种锁定机制,以防止需要对会话状态进行读/写访问的两个或多个并发请求访问给定会话.该机制通过防止并发请求覆盖彼此的更改来确保会话状态的一致性.即使会话状态数据源是多个Web服务器共享的远程资源,锁定机制也必须工作.